[
  {
    "path": ".gitignore",
    "content": "# Created by https://www.gitignore.io\n\n### Swift ###\n# Xcode\n#\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata\n*.xccheckout\n*.moved-aside\nDerivedData\n*.hmap\n*.ipa\n*.xcuserstate\n\n# CocoaPods\n#\n# We recommend against adding the Pods directory to your .gitignore. However\n# you should judge for yourself, the pros and cons are mentioned at:\n# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control\n#\nPods/\n\n# Carthage\n#\n# Add this line if you want to avoid checking in source code from Carthage dependencies.\nCarthage/Checkouts\nCarthage/Build\n"
  },
  {
    "path": "GCProgressSample/GCProgressSample/AlertHelperKit.swift",
    "content": "//\n//  AlertHelperKit.swift\n//\n//  Created by keygx on 2015/07/21.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\n\nimport UIKit\n\npublic enum ActionSheetPopoverStyle: Int {\n    case normal = 0\n    case barButton\n}\n\npublic struct Parameters {\n    var title: String?\n    var message: String?\n    var cancelButton: String?\n    var destructiveButtons: [String]?\n    var otherButtons: [String]?\n    var disabledButtons: [String]?\n    var inputFields: [InputField]?\n    var sender: AnyObject?\n    var arrowDirection: UIPopoverArrowDirection?\n    var popoverStyle: ActionSheetPopoverStyle = .normal\n    \n    public init(\n        title: String? = nil,\n        message: String? = nil,\n        cancelButton: String? = nil,\n        destructiveButtons: [String]? = nil,\n        otherButtons: [String]? = nil,\n        disabledButtons: [String]? = nil,\n        inputFields: [InputField]? = nil,\n        sender: AnyObject? = nil,\n        arrowDirection: UIPopoverArrowDirection? = nil,\n        popoverStyle: ActionSheetPopoverStyle = .normal\n        ) {\n        self.title = title\n        self.message = message\n        self.cancelButton = cancelButton\n        self.destructiveButtons = destructiveButtons\n        self.otherButtons = otherButtons\n        self.disabledButtons = disabledButtons\n        self.inputFields = inputFields\n        self.sender = sender\n        self.arrowDirection = arrowDirection\n        self.popoverStyle = popoverStyle\n    }\n}\n\npublic struct InputField {\n    var placeholder: String\n    var secure: Bool?\n    \n    public init(placeholder: String, secure: Bool?) {\n        self.placeholder = placeholder\n        self.secure = secure\n    }\n}\n\npublic class AlertHelperKit {\n    \n    public var animated: Bool = true\n    public var completionHandler: (() -> Void)?\n    public var textFields: [AnyObject]?\n    \n    public init() {\n        initialize()\n    }\n    \n    private func initialize() {\n        animated = true\n        completionHandler = nil\n        textFields = nil\n    }\n    \n    // Alert\n    public func showAlert(_ parent: UIViewController, title: String?, message: String?, button: String) {\n        let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)\n        \n        // cancel\n        let cancelAction = UIAlertAction(title: button, style: .cancel, handler: nil)\n        alertController.addAction(cancelAction)\n        \n        show(parent, ac: alertController)\n    }\n    \n    // Alert with Callback Handler\n    public func showAlertWithHandler(_ parent: UIViewController, parameters: Parameters, handler: @escaping (Int) -> ()) {\n        let alertController: UIAlertController = buildAlertController(.alert, params: parameters) { buttonIndex in\n            handler(buttonIndex)\n        }\n        \n        buttonDisabled(alertController, params: parameters)\n        \n        show(parent, ac: alertController)\n    }\n    \n    // ActionSheet\n    public func showActionSheet(_ parent: UIViewController, parameters: Parameters, handler: @escaping (Int) -> ()) {\n        let alertController: UIAlertController = buildAlertController(.actionSheet, params: parameters) { buttonIndex in\n            handler(buttonIndex)\n        }\n        \n        buttonDisabled(alertController, params: parameters)\n        \n        if let popover = alertController.popoverPresentationController, let sender: AnyObject = parameters.sender, let arrowDirection = parameters.arrowDirection {\n            popover.sourceView = parent.view\n            \n            switch parameters.popoverStyle {\n            case .barButton:\n                guard let barButton = sender as? UIBarButtonItem else { return }\n                popover.barButtonItem = barButton\n            default:\n                guard let button = sender as? UIButton else { return }\n                popover.sourceRect = button.frame\n            }\n            \n            popover.permittedArrowDirections = arrowDirection\n        }\n        \n        show(parent, ac: alertController)\n    }\n    \n    // Build AlertController\n    private func buildAlertController(_ style: UIAlertController.Style, params: Parameters, handler: @escaping (Int) -> ()) -> UIAlertController {\n        \n        let alertController = UIAlertController(title: params.title, message: params.message, preferredStyle: style)\n        let destructivOffset = 1\n        var othersOffset = destructivOffset\n        \n        // cancel\n        if let cancel = params.cancelButton {\n            let cancelAction = UIAlertAction(title: cancel, style: .cancel) { _ in\n                handler(0)\n            }\n            alertController.addAction(cancelAction)\n        }\n        \n        // destructive\n        if let destructive = params.destructiveButtons {\n            for i in 0..<destructive.count {\n                let destructiveAction = UIAlertAction(title: destructive[i], style: .destructive) { _ in\n                    handler(i + destructivOffset)\n                }\n                alertController.addAction(destructiveAction)\n                \n                othersOffset += 1\n            }\n        }\n        \n        // others\n        if let others = params.otherButtons {\n            for i in 0..<others.count {\n                let otherAction = UIAlertAction(title: others[i], style: .default) { _ in\n                    handler(i + othersOffset)\n                }\n                alertController.addAction(otherAction)\n            }\n        }\n        \n        // textFields\n        if style != .actionSheet {\n            if let inputFields = params.inputFields {\n                for i in 0..<inputFields.count {\n                    alertController.addTextField(configurationHandler: { textField in\n                        // placeholder\n                        textField.placeholder = inputFields[i].placeholder\n                        // secure\n                        if let secure = inputFields[i].secure {\n                            textField.isSecureTextEntry = secure\n                        }\n                    })\n                }\n            }\n        }\n        \n        return alertController\n    }\n    \n    // Button Disabled\n    private func buttonDisabled(_ alertController: UIAlertController, params: Parameters) {\n        guard let buttons = params.disabledButtons else {\n            return\n        }\n        \n        for alertAction in alertController.actions {\n            let action: UIAlertAction = alertAction\n            for title in buttons {\n                if action.title == title {\n                    action.isEnabled = false\n                }\n            }\n        }\n    }\n    \n    // Appear Alert\n    private func show(_ vc: UIViewController, ac: UIAlertController) {\n        textFields = ac.textFields\n        vc.present(ac, animated: animated, completion: completionHandler)\n    }\n    \n}\n"
  },
  {
    "path": "GCProgressSample/GCProgressSample/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  GCProgressSample\n//\n//  Created by keygx on 2015/06/21.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\n\nimport UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n    var window: UIWindow?\n\n\n    private func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {\n        // Override point for customization after application launch.\n        return true\n    }\n\n    func applicationWillResignActive(_ application: UIApplication) {\n        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.\n        // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.\n    }\n\n    func applicationDidEnterBackground(_ application: UIApplication) {\n        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.\n        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.\n    }\n\n    func applicationWillEnterForeground(_ application: UIApplication) {\n        // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.\n    }\n\n    func applicationDidBecomeActive(_ application: UIApplication) {\n        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.\n    }\n\n    func applicationWillTerminate(_ application: UIApplication) {\n        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.\n    }\n\n\n}\n\n"
  },
  {
    "path": "GCProgressSample/GCProgressSample/AsyncUtil.swift",
    "content": "//\n//  AsyncUtil.swift\n//  GCProgressSample\n//\n//  Created by keygx on 2016/02/20.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\n\nimport Foundation\n\nclass AsyncUtil {\n    \n    func dispatchOnMainThread(_ block: @escaping () -> (), delay: Double) {\n        if delay == 0 {\n            DispatchQueue.main.async {\n                block()\n            }\n            return\n        }\n        \n        let d = DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)\n        DispatchQueue.main.asyncAfter(deadline: d) {\n            block()\n        }\n    }\n}\n"
  },
  {
    "path": "GCProgressSample/GCProgressSample/BackgroundTransparentStyle.swift",
    "content": "//\n//  BackgroundTransparentStyle.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2016/12/03.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\n\nimport GradientCircularProgress\n\npublic struct BackgroundTransparentStyle: StyleProperty {\n    /*** style properties **********************************************************************************/\n    \n    // Progress Size\n    public var progressSize: CGFloat = 200\n    \n    // Gradient Circular\n    public var arcLineWidth: CGFloat = 4.0\n    public var startArcColor: UIColor = ColorUtil.toUIColor(r: 0.0, g: 122.0, b: 255.0, a: 1.0)\n    public var endArcColor: UIColor = UIColor.cyan\n    \n    // Base Circular\n    public var baseLineWidth: CGFloat? = 6.0\n    public var baseArcColor: UIColor? = UIColor(red:0.0, green: 0.0, blue: 0.0, alpha: 0.2)\n    \n    // Ratio\n    public var ratioLabelFont: UIFont? = UIFont.systemFont(ofSize: 16.0)\n    public var ratioLabelFontColor: UIColor? = UIColor.black\n    \n    // Message\n    public var messageLabelFont: UIFont? = UIFont.systemFont(ofSize: 16.0)\n    public var messageLabelFontColor: UIColor? = UIColor.black\n    \n    // Background\n    public var backgroundStyle: BackgroundStyles = .transparent\n    \n    // Dismiss\n    public var dismissTimeInterval: Double? = nil // 'nil' for default setting.\n    \n    /*** style properties **********************************************************************************/\n    \n    public init() {}\n}\n"
  },
  {
    "path": "GCProgressSample/GCProgressSample/Base.lproj/LaunchScreen.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"14490.70\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\">\n    <device id=\"retina4_0\" orientation=\"portrait\">\n        <adaptation id=\"fullscreen\"/>\n    </device>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"14490.49\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <view contentMode=\"scaleToFill\" id=\"iN0-l3-epB\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"480\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"GCProgressSample\" textAlignment=\"center\" lineBreakMode=\"middleTruncation\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"18\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kId-c2-rCX\">\n                    <rect key=\"frame\" x=\"20\" y=\"139.5\" width=\"440\" height=\"43\"/>\n                    <fontDescription key=\"fontDescription\" type=\"boldSystem\" pointSize=\"36\"/>\n                    <color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n            </subviews>\n            <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n            <constraints>\n                <constraint firstItem=\"kId-c2-rCX\" firstAttribute=\"centerY\" secondItem=\"iN0-l3-epB\" secondAttribute=\"bottom\" multiplier=\"1/3\" constant=\"1\" id=\"5cJ-9S-tgC\"/>\n                <constraint firstAttribute=\"centerX\" secondItem=\"kId-c2-rCX\" secondAttribute=\"centerX\" id=\"Koa-jz-hwk\"/>\n                <constraint firstItem=\"kId-c2-rCX\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"fvb-Df-36g\"/>\n            </constraints>\n            <nil key=\"simulatedStatusBarMetrics\"/>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <point key=\"canvasLocation\" x=\"548\" y=\"455\"/>\n        </view>\n    </objects>\n</document>\n"
  },
  {
    "path": "GCProgressSample/GCProgressSample/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"14490.70\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\" initialViewController=\"BYZ-38-t0r\">\n    <device id=\"retina4_7\" orientation=\"portrait\">\n        <adaptation id=\"fullscreen\"/>\n    </device>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"14490.49\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" customClass=\"ViewController\" customModule=\"GCProgressSample\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"y3c-jy-aDJ\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"wfy-db-euE\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"8bC-Xf-vdC\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"14u-O2-CKF\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"80\" width=\"375\" height=\"40\"/>\n                                <color key=\"backgroundColor\" red=\"0.84705882352941175\" green=\"0.84705882352941175\" blue=\"0.84705882352941175\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"40\" id=\"X4i-OC-iK1\"/>\n                                </constraints>\n                                <fontDescription key=\"fontDescription\" type=\"boldSystem\" pointSize=\"16\"/>\n                                <color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"7rc-3Q-ddQ\">\n                                <rect key=\"frame\" x=\"117\" y=\"124\" width=\"140\" height=\"28\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"28\" id=\"P3A-Qv-Bhn\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"140\" id=\"l71-eE-CY3\"/>\n                                </constraints>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <state key=\"normal\" title=\"Choose Style\"/>\n                                <connections>\n                                    <action selector=\"btnChooseStyleAction:\" destination=\"BYZ-38-t0r\" eventType=\"touchUpInside\" id=\"Mv0-jr-lpc\"/>\n                                </connections>\n                            </button>\n                            <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"iZP-hJ-h5b\" customClass=\"MyButton\" customModule=\"GCProgressSample\" customModuleProvider=\"target\">\n                                <rect key=\"frame\" x=\"20\" y=\"607\" width=\"335\" height=\"40\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" constant=\"560\" id=\"UEd-zK-JjE\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"40\" id=\"tKM-G9-JlM\"/>\n                                </constraints>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <state key=\"normal\" title=\"Update Message\"/>\n                                <variation key=\"default\">\n                                    <mask key=\"constraints\">\n                                        <exclude reference=\"UEd-zK-JjE\"/>\n                                    </mask>\n                                </variation>\n                                <connections>\n                                    <action selector=\"btnUpdateMessageAction:\" destination=\"BYZ-38-t0r\" eventType=\"touchUpInside\" id=\"9aR-L7-2tw\"/>\n                                </connections>\n                            </button>\n                            <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"IZo-36-T7V\" customClass=\"MyButton\" customModule=\"GCProgressSample\" customModuleProvider=\"target\">\n                                <rect key=\"frame\" x=\"20\" y=\"557\" width=\"335\" height=\"40\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"40\" id=\"7O2-P4-a6D\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"560\" id=\"MKp-AB-eGC\"/>\n                                </constraints>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <state key=\"normal\" title=\"Basic\"/>\n                                <variation key=\"default\">\n                                    <mask key=\"constraints\">\n                                        <exclude reference=\"MKp-AB-eGC\"/>\n                                    </mask>\n                                </variation>\n                                <connections>\n                                    <action selector=\"btnBasicAction:\" destination=\"BYZ-38-t0r\" eventType=\"touchUpInside\" id=\"a8V-va-ahk\"/>\n                                </connections>\n                            </button>\n                            <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Hvr-2X-bR2\" customClass=\"MyButton\" customModule=\"GCProgressSample\" customModuleProvider=\"target\">\n                                <rect key=\"frame\" x=\"20\" y=\"507\" width=\"335\" height=\"40\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" constant=\"560\" id=\"0XB-wQ-jLr\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"40\" id=\"qk4-VJ-x8C\"/>\n                                </constraints>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <state key=\"normal\" title=\"at Ratio\"/>\n                                <variation key=\"default\">\n                                    <mask key=\"constraints\">\n                                        <exclude reference=\"0XB-wQ-jLr\"/>\n                                    </mask>\n                                </variation>\n                                <connections>\n                                    <action selector=\"btnAtRatioAction:\" destination=\"BYZ-38-t0r\" eventType=\"touchUpInside\" id=\"T2m-vo-6Ue\"/>\n                                </connections>\n                            </button>\n                            <segmentedControl opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"top\" segmentControlStyle=\"plain\" selectedSegmentIndex=\"0\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"p5D-XQ-8cA\">\n                                <rect key=\"frame\" x=\"20\" y=\"36\" width=\"335\" height=\"29\"/>\n                                <segments>\n                                    <segment title=\"UIWindow\"/>\n                                    <segment title=\"addSubView\"/>\n                                </segments>\n                                <connections>\n                                    <action selector=\"segmentedControlAction:\" destination=\"BYZ-38-t0r\" eventType=\"valueChanged\" id=\"mrb-th-vDk\"/>\n                                </connections>\n                            </segmentedControl>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"iZP-hJ-h5b\" firstAttribute=\"leading\" secondItem=\"8bC-Xf-vdC\" secondAttribute=\"leading\" constant=\"20\" id=\"0bi-ow-fhy\"/>\n                            <constraint firstItem=\"p5D-XQ-8cA\" firstAttribute=\"top\" secondItem=\"y3c-jy-aDJ\" secondAttribute=\"bottom\" constant=\"16\" id=\"2VA-BK-BQR\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"iZP-hJ-h5b\" secondAttribute=\"trailing\" constant=\"20\" id=\"2iH-8F-Atp\"/>\n                            <constraint firstItem=\"IZo-36-T7V\" firstAttribute=\"top\" secondItem=\"Hvr-2X-bR2\" secondAttribute=\"bottom\" constant=\"10\" id=\"6rB-Rs-Y4T\"/>\n                            <constraint firstItem=\"7rc-3Q-ddQ\" firstAttribute=\"top\" secondItem=\"14u-O2-CKF\" secondAttribute=\"bottom\" constant=\"4\" id=\"8Wy-kA-hAo\"/>\n                            <constraint firstItem=\"14u-O2-CKF\" firstAttribute=\"leading\" secondItem=\"8bC-Xf-vdC\" secondAttribute=\"leading\" id=\"IKq-Ow-nBT\"/>\n                            <constraint firstItem=\"14u-O2-CKF\" firstAttribute=\"top\" secondItem=\"p5D-XQ-8cA\" secondAttribute=\"bottom\" constant=\"16\" id=\"Nva-VJ-B6j\"/>\n                            <constraint firstItem=\"IZo-36-T7V\" firstAttribute=\"leading\" secondItem=\"8bC-Xf-vdC\" secondAttribute=\"leading\" constant=\"20\" id=\"T4X-bj-hx6\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"IZo-36-T7V\" secondAttribute=\"trailing\" constant=\"20\" id=\"Tc9-n1-lxi\"/>\n                            <constraint firstItem=\"7rc-3Q-ddQ\" firstAttribute=\"centerX\" secondItem=\"8bC-Xf-vdC\" secondAttribute=\"centerX\" id=\"WDH-iy-XO8\"/>\n                            <constraint firstItem=\"Hvr-2X-bR2\" firstAttribute=\"leading\" secondItem=\"8bC-Xf-vdC\" secondAttribute=\"leading\" constant=\"20\" id=\"bIg-OL-gUs\"/>\n                            <constraint firstItem=\"p5D-XQ-8cA\" firstAttribute=\"leading\" secondItem=\"8bC-Xf-vdC\" secondAttribute=\"leading\" constant=\"20\" id=\"bQn-AN-jxl\"/>\n                            <constraint firstItem=\"iZP-hJ-h5b\" firstAttribute=\"top\" secondItem=\"IZo-36-T7V\" secondAttribute=\"bottom\" constant=\"10\" id=\"hMh-oS-JVW\"/>\n                            <constraint firstItem=\"wfy-db-euE\" firstAttribute=\"top\" secondItem=\"iZP-hJ-h5b\" secondAttribute=\"bottom\" constant=\"20\" id=\"jxc-o1-hcQ\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"Hvr-2X-bR2\" secondAttribute=\"trailing\" constant=\"20\" id=\"k80-m2-GXu\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"14u-O2-CKF\" secondAttribute=\"trailing\" id=\"kLu-DU-4eP\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"p5D-XQ-8cA\" secondAttribute=\"trailing\" constant=\"20\" id=\"yXU-o4-JcL\"/>\n                        </constraints>\n                    </view>\n                    <connections>\n                        <outlet property=\"btnAtRatio\" destination=\"Hvr-2X-bR2\" id=\"2by-N2-74j\"/>\n                        <outlet property=\"btnBasic\" destination=\"IZo-36-T7V\" id=\"Jzp-Ix-5Ds\"/>\n                        <outlet property=\"btnUpdateMessage\" destination=\"iZP-hJ-h5b\" id=\"PsA-c4-vTc\"/>\n                        <outlet property=\"segmentedControl\" destination=\"p5D-XQ-8cA\" id=\"R87-xN-24E\"/>\n                        <outlet property=\"styleLabel\" destination=\"14u-O2-CKF\" id=\"XF2-lH-n9P\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"348.5\" y=\"248.5\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "GCProgressSample/GCProgressSample/Images.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"83.5x83.5\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "GCProgressSample/GCProgressSample/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>$(MARKETING_VERSION)</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(CURRENT_PROJECT_VERSION)</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "GCProgressSample/GCProgressSample/MyButton.swift",
    "content": "//\n//  MyButton.swift\n//  GCProgressSample\n//\n//  Created by keygx on 2016/03/12.\n//  Copyright © 2016年 keygx. All rights reserved.\n//\n\nimport UIKit\n\n\n\nclass MyButton: UIButton {\n    \n    enum ButtonStatus {\n        case normal\n        case highlighted\n        case selected\n        case disabled\n    }\n    \n    var status: ButtonStatus = .normal {\n        didSet {\n            switch status {\n            case .disabled:\n                isEnabled = false\n            default:\n                isEnabled = true\n            }\n            apply()\n        }\n    }\n    \n    private let defaultColor: UIColor = UIColor(red: 0.0/255.0, green: 122.0/255.0, blue: 255.0/255.0, alpha: 1.0)\n    private let disabledColor: UIColor = UIColor.lightGray\n    \n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        \n        initialize()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        super.init(coder: aDecoder)\n        \n        initialize()\n    }\n    \n    private func initialize() {\n        status = .normal\n        \n        layer.cornerRadius = 4.0\n        layer.borderWidth = 1.0\n    }\n    \n    func apply() {\n        switch status {\n        case .disabled:\n            setTitleColor(disabledColor, for: .disabled)\n            layer.borderColor = disabledColor.cgColor\n        default:\n            setTitleColor(defaultColor, for: UIControl.State())\n            layer.borderColor = defaultColor.cgColor\n        }\n    }\n}\n"
  },
  {
    "path": "GCProgressSample/GCProgressSample/MyStyle.swift",
    "content": "//\n//  MyStyle.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/11/25.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\n\nimport GradientCircularProgress\n\npublic struct MyStyle: StyleProperty {\n    /*** style properties **********************************************************************************/\n    \n    // Progress Size\n    public var progressSize: CGFloat = 200\n    \n    // Gradient Circular\n    public var arcLineWidth: CGFloat = 18.0\n    public var startArcColor: UIColor = UIColor.clear\n    public var endArcColor: UIColor = UIColor.orange\n    \n    // Base Circular\n    public var baseLineWidth: CGFloat? = 19.0\n    public var baseArcColor: UIColor? = UIColor.darkGray\n    \n    // Ratio\n    public var ratioLabelFont: UIFont? = UIFont(name: \"Verdana-Bold\", size: 16.0)\n    public var ratioLabelFontColor: UIColor? = UIColor.white\n    \n    // Message\n    public var messageLabelFont: UIFont? = UIFont.systemFont(ofSize: 16.0)\n    public var messageLabelFontColor: UIColor? = UIColor.white\n    \n    // Background\n    public var backgroundStyle: BackgroundStyles = .dark\n    \n    // Dismiss\n    public var dismissTimeInterval: Double? = 0.0 // 'nil' for default setting.\n    \n    /*** style properties **********************************************************************************/\n    \n    public init() {}\n}\n"
  },
  {
    "path": "GCProgressSample/GCProgressSample/ViewController.swift",
    "content": "//\n//  ViewController.swift\n//  GCProgressSample\n//\n//  Created by keygx on 2016/03/12.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\n\nimport UIKit\nimport GradientCircularProgress\n\nclass ViewController: UIViewController {\n    \n    // UI\n    enum UsageType {\n        case window\n        case subView\n    }\n    \n    let styleList: [(String, StyleProperty)] = [\n        (\"Style.swift\", Style()),\n        (\"BlueDarkStyle.swift\", BlueDarkStyle()),\n        (\"OrangeClearStyle.swift\", OrangeClearStyle()),\n        (\"GreenLightStyle.swift\", GreenLightStyle()),\n        (\"BlueIndicatorStyle.swift\", BlueIndicatorStyle()),\n        (\"MyStyle.swift\", MyStyle()),\n        (\"BackgroundTransparentStyle\", BackgroundTransparentStyle()),\n    ]\n    \n    var usageType: UsageType = .window\n    \n    var seletedStyleIndex: Int = 0 {\n        willSet {\n            styleLabel.text = styleList[newValue].0\n        }\n    }\n    \n    @IBOutlet weak var segmentedControl: UISegmentedControl!\n    @IBOutlet weak var styleLabel: UILabel!\n    @IBOutlet weak var btnAtRatio: MyButton!\n    @IBOutlet weak var btnBasic: MyButton!\n    @IBOutlet weak var btnUpdateMessage: MyButton!\n\n    // Progress\n    let progress = GradientCircularProgress()\n    var progressView: UIView?\n    \n    // Demo\n    var timer: Timer?\n    var v: Double = 0.0\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        usageType = .window\n        seletedStyleIndex = 0\n    }\n\n    override func didReceiveMemoryWarning() {\n        super.didReceiveMemoryWarning()\n    }\n    \n    @IBAction func segmentedControlAction(_ sender: AnyObject) {\n        switch sender.selectedSegmentIndex {\n        case 0:\n            usageType = .window\n        case 1:\n            usageType = .subView\n        default:\n            break\n        }\n    }\n    \n    @IBAction func btnChooseStyleAction(_ sender: AnyObject) {\n        \n        let styleTitleList: [String] = styleList.map {$0.0}\n        \n        let params = Parameters(\n            title: nil,\n            message: nil,\n            cancelButton: \"Cancel\",\n            otherButtons: styleTitleList\n        )\n        \n        AlertHelperKit().showAlertWithHandler(self, parameters: params) { buttonIndex in\n            switch buttonIndex {\n            case 1:\n                self.seletedStyleIndex = buttonIndex - 1\n                self.btnUpdateMessage.status = .normal\n            case 2:\n                self.seletedStyleIndex = buttonIndex - 1\n                self.btnUpdateMessage.status = .normal\n            case 3:\n                self.seletedStyleIndex = buttonIndex - 1\n                self.btnUpdateMessage.status = .disabled\n            case 4:\n                self.seletedStyleIndex = buttonIndex - 1\n                self.btnUpdateMessage.status = .normal\n            case 5:\n                self.seletedStyleIndex = buttonIndex - 1\n                self.btnUpdateMessage.status = .disabled\n            case 6:\n                self.seletedStyleIndex = buttonIndex - 1\n                self.btnUpdateMessage.status = .normal\n            case 7:\n                self.seletedStyleIndex = buttonIndex - 1\n                self.btnUpdateMessage.status = .normal\n            default: break\n                // Cancel\n            }\n        }\n    }\n    \n    @IBAction func btnAtRatioAction(_ sender: AnyObject) {\n        if progress.isAvailable {\n            return\n        }\n        \n        if usageType == .window {\n            showAtRatio()\n        } else {\n            showAtRatioTypeSubView()\n        }\n    }\n    \n    @IBAction func btnBasicAction(_ sender: AnyObject) {\n        if progress.isAvailable {\n            return\n        }\n        \n        if usageType == .window {\n            showBasic()\n        } else {\n            showBasicTypeSubView()\n        }\n    }\n    \n    @IBAction func btnUpdateMessageAction(_ sender: AnyObject) {\n        if progress.isAvailable {\n            return\n        }\n        \n        if usageType == .window {\n            showUpdateMessage()\n        } else {\n            showUpdateMessageTypeSubView()\n        }\n    }\n}\n\n// UIWindow\nextension ViewController {\n    \n    func showAtRatio() {\n        var displayFlag: Bool\n        \n        switch seletedStyleIndex {\n        case 4:\n            displayFlag = false\n        default:\n            displayFlag = true\n        }\n        \n        progress.showAtRatio(display: displayFlag, style: styleList[seletedStyleIndex].1)\n        startProgressAtRatio()\n    }\n    \n    func showBasic() {\n        progress.show(message: \"Loading...\", style: styleList[seletedStyleIndex].1)\n        delayCloseProgress()\n    }\n    \n    func showUpdateMessage() {\n        progress.show(message: \"Download\\n0 / 4\", style: styleList[seletedStyleIndex].1)\n        startProgressBasic()\n    }\n}\n\n// SubView\nextension ViewController {\n    \n    func showAtRatioTypeSubView() {\n        var displayFlag: Bool\n        \n        switch seletedStyleIndex {\n        case 4:\n            displayFlag = false\n        default:\n            displayFlag = true\n        }\n        \n        progressView = progress.showAtRatio(frame: getRect(), display: displayFlag, style: styleList[seletedStyleIndex].1)\n        progressView?.layer.cornerRadius = 12.0\n        view.addSubview(progressView!)\n        \n        startProgressAtRatio()\n    }\n    \n    func showBasicTypeSubView() {\n        progressView = progress.show(frame: getRect(), message: \"Loading...\", style: styleList[seletedStyleIndex].1)\n        progressView?.layer.cornerRadius = 12.0\n        view.addSubview(progressView!)\n        \n        delayCloseProgress()\n    }\n    \n    func showUpdateMessageTypeSubView() {\n        progressView = progress.show(frame: getRect(), message: \"Download\\n0 / 4\", style: styleList[seletedStyleIndex].1)\n        progressView?.layer.cornerRadius = 12.0\n        view.addSubview(progressView!)\n        \n        startProgressBasic()\n    }\n}\n\n// for demo\nextension ViewController {\n    \n    func delayCloseProgress() {\n        AsyncUtil().dispatchOnMainThread({\n            switch self.usageType {\n            case .window:\n                self.progress.dismiss()\n            case .subView:\n                self.progress.dismiss(progress: self.progressView!)\n            }\n        },\n        delay: 2.0)\n    }\n    \n    func startProgressBasic() {\n        v = 0.0\n        \n        timer = Timer.scheduledTimer(\n            timeInterval: 0.01,\n            target: self,\n            selector: #selector(updateMessage),\n            userInfo: nil,\n            repeats: true\n        )\n        RunLoop.main.add(timer!, forMode: RunLoop.Mode.common)\n    }\n    \n    @objc func updateMessage() {\n        v += 0.002\n        \n        if v > 1.00 {\n            progress.updateMessage(message: \"Download\\n4 / 4\")\n            timer!.invalidate()\n            \n            AsyncUtil().dispatchOnMainThread({\n                    self.progress.updateMessage(message: \"Completed!\")\n\n                    switch self.usageType {\n                    case .window:\n                        self.progress.dismiss()\n                    case .subView:\n                        self.progress.dismiss(progress: self.progressView!)\n                }\n            }, delay: 0.8)\n            \n            return\n        \n        } else if v > 0.75 {\n            progress.updateMessage(message: \"Download\\n3 / 4\")\n        \n        } else if v > 0.5 {\n            progress.updateMessage(message: \"Download\\n2 / 4\")\n        \n        } else if v > 0.25 {\n            progress.updateMessage(message: \"Download\\n1 / 4\")\n        }\n    }\n    \n    func startProgressAtRatio() {\n        v = 0.0\n        \n        timer = Timer.scheduledTimer(\n            timeInterval: 0.01,\n            target: self,\n            selector: #selector(updateProgressAtRatio),\n            userInfo: nil,\n            repeats: true\n        )\n        RunLoop.main.add(timer!, forMode: RunLoop.Mode.common)\n    }\n    \n    @objc func updateProgressAtRatio() {\n        v += 0.01\n        \n        progress.updateRatio(CGFloat(v))\n        \n        if v > 1.00 {\n            timer!.invalidate()\n            \n            switch usageType {\n            case .window:\n                progress.dismiss()\n            case .subView:\n                progress.dismiss(progress: progressView!)\n            }\n            return\n        }\n    }\n    \n    func getRect() -> CGRect {\n        return CGRect(\n            x: view.frame.origin.x + 15,\n            y: (view.frame.size.height - view.frame.size.width) / 2,\n            width: view.frame.size.width - 30,\n            height: view.frame.size.width - 30)\n    }\n}\n"
  },
  {
    "path": "GCProgressSample/GCProgressSample.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t360F44AB1DF27B2800835EA0 /* BackgroundTransparentStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 360F44AA1DF27B2800835EA0 /* BackgroundTransparentStyle.swift */; };\n\t\t362C51F91C9AB926008C1C81 /* AlertHelperKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 362C51F81C9AB926008C1C81 /* AlertHelperKit.swift */; };\n\t\t3632ED251C7833CD006484E5 /* AsyncUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3632ED241C7833CD006484E5 /* AsyncUtil.swift */; };\n\t\t366555DE1C9D900F00767B90 /* MyButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 366555DD1C9D900F00767B90 /* MyButton.swift */; };\n\t\t3667E0ED23392FEC002CCD9C /* WindowBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3667E0EC23392FEC002CCD9C /* WindowBuilder.swift */; };\n\t\t368F0E4E1C35319E008B1AC4 /* MyStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 368F0E4D1C35319E008B1AC4 /* MyStyle.swift */; };\n\t\t36CC1C821B37083E009DE1F8 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36CC1C811B37083E009DE1F8 /* AppDelegate.swift */; };\n\t\t36CC1C841B37083E009DE1F8 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36CC1C831B37083E009DE1F8 /* ViewController.swift */; };\n\t\t36CC1C871B37083E009DE1F8 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 36CC1C851B37083E009DE1F8 /* Main.storyboard */; };\n\t\t36CC1C891B37083E009DE1F8 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 36CC1C881B37083E009DE1F8 /* Images.xcassets */; };\n\t\t36CC1C8C1B37083E009DE1F8 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 36CC1C8A1B37083E009DE1F8 /* LaunchScreen.xib */; };\n\t\t36CC1C981B37083E009DE1F8 /* GCProgressSampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36CC1C971B37083E009DE1F8 /* GCProgressSampleTests.swift */; };\n\t\t36CE2B5D1C93EA740084CE64 /* GradientCircularProgress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36CE2B471C93EA740084CE64 /* GradientCircularProgress.swift */; };\n\t\t36CE2B5E1C93EA740084CE64 /* CircularProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36CE2B4A1C93EA740084CE64 /* CircularProgressView.swift */; };\n\t\t36CE2B5F1C93EA740084CE64 /* ProgressAtRatioView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36CE2B4B1C93EA740084CE64 /* ProgressAtRatioView.swift */; };\n\t\t36CE2B601C93EA740084CE64 /* ArcView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36CE2B4D1C93EA740084CE64 /* ArcView.swift */; };\n\t\t36CE2B611C93EA740084CE64 /* Background.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36CE2B4E1C93EA740084CE64 /* Background.swift */; };\n\t\t36CE2B631C93EA740084CE64 /* GradientArcView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36CE2B501C93EA740084CE64 /* GradientArcView.swift */; };\n\t\t36CE2B641C93EA740084CE64 /* GradientArcWithClearColorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36CE2B511C93EA740084CE64 /* GradientArcWithClearColorView.swift */; };\n\t\t36CE2B651C93EA740084CE64 /* ProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36CE2B521C93EA740084CE64 /* ProgressView.swift */; };\n\t\t36CE2B661C93EA740084CE64 /* ProgressViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36CE2B531C93EA740084CE64 /* ProgressViewController.swift */; };\n\t\t36CE2B671C93EA740084CE64 /* Property.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36CE2B541C93EA740084CE64 /* Property.swift */; };\n\t\t36CE2B681C93EA740084CE64 /* BlueDarkStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36CE2B561C93EA740084CE64 /* BlueDarkStyle.swift */; };\n\t\t36CE2B691C93EA740084CE64 /* BlueIndicatorStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36CE2B571C93EA740084CE64 /* BlueIndicatorStyle.swift */; };\n\t\t36CE2B6A1C93EA740084CE64 /* GreenLightStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36CE2B581C93EA740084CE64 /* GreenLightStyle.swift */; };\n\t\t36CE2B6B1C93EA740084CE64 /* OrangeClearStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36CE2B591C93EA740084CE64 /* OrangeClearStyle.swift */; };\n\t\t36CE2B6C1C93EA740084CE64 /* Style.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36CE2B5A1C93EA740084CE64 /* Style.swift */; };\n\t\t36CE2B6D1C93EA740084CE64 /* ColorUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36CE2B5C1C93EA740084CE64 /* ColorUtil.swift */; };\n\t\t36F742C01B3A7016003D799C /* GradientCircularProgress.h in Headers */ = {isa = PBXBuildFile; fileRef = 36F742BF1B3A7016003D799C /* GradientCircularProgress.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t36F742D21B3A7016003D799C /* GradientCircularProgress.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 36F742BB1B3A7016003D799C /* GradientCircularProgress.framework */; };\n\t\t36F742D31B3A7016003D799C /* GradientCircularProgress.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 36F742BB1B3A7016003D799C /* GradientCircularProgress.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t36CC1C921B37083E009DE1F8 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 36CC1C741B37083E009DE1F8 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 36CC1C7B1B37083E009DE1F8;\n\t\t\tremoteInfo = GCProgressSample;\n\t\t};\n\t\t36F742D01B3A7016003D799C /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 36CC1C741B37083E009DE1F8 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 36F742BA1B3A7016003D799C;\n\t\t\tremoteInfo = GradientCircularProgress;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t36F742D91B3A7016003D799C /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t36F742D31B3A7016003D799C /* GradientCircularProgress.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t360F44AA1DF27B2800835EA0 /* BackgroundTransparentStyle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BackgroundTransparentStyle.swift; sourceTree = \"<group>\"; };\n\t\t362C51F81C9AB926008C1C81 /* AlertHelperKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AlertHelperKit.swift; sourceTree = \"<group>\"; };\n\t\t3632ED241C7833CD006484E5 /* AsyncUtil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AsyncUtil.swift; sourceTree = \"<group>\"; };\n\t\t366555DD1C9D900F00767B90 /* MyButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyButton.swift; sourceTree = \"<group>\"; };\n\t\t3667E0EC23392FEC002CCD9C /* WindowBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WindowBuilder.swift; sourceTree = \"<group>\"; };\n\t\t368F0E4D1C35319E008B1AC4 /* MyStyle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyStyle.swift; sourceTree = \"<group>\"; };\n\t\t36CC1C7C1B37083E009DE1F8 /* GCProgressSample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GCProgressSample.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t36CC1C801B37083E009DE1F8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t36CC1C811B37083E009DE1F8 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t36CC1C831B37083E009DE1F8 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = \"<group>\"; };\n\t\t36CC1C861B37083E009DE1F8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t36CC1C881B37083E009DE1F8 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = \"<group>\"; };\n\t\t36CC1C8B1B37083E009DE1F8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = \"<group>\"; };\n\t\t36CC1C911B37083E009DE1F8 /* GCProgressSampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GCProgressSampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t36CC1C961B37083E009DE1F8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t36CC1C971B37083E009DE1F8 /* GCProgressSampleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GCProgressSampleTests.swift; sourceTree = \"<group>\"; };\n\t\t36CE2B471C93EA740084CE64 /* GradientCircularProgress.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GradientCircularProgress.swift; sourceTree = \"<group>\"; };\n\t\t36CE2B4A1C93EA740084CE64 /* CircularProgressView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CircularProgressView.swift; sourceTree = \"<group>\"; };\n\t\t36CE2B4B1C93EA740084CE64 /* ProgressAtRatioView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProgressAtRatioView.swift; sourceTree = \"<group>\"; };\n\t\t36CE2B4D1C93EA740084CE64 /* ArcView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ArcView.swift; sourceTree = \"<group>\"; };\n\t\t36CE2B4E1C93EA740084CE64 /* Background.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Background.swift; sourceTree = \"<group>\"; };\n\t\t36CE2B501C93EA740084CE64 /* GradientArcView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GradientArcView.swift; sourceTree = \"<group>\"; };\n\t\t36CE2B511C93EA740084CE64 /* GradientArcWithClearColorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GradientArcWithClearColorView.swift; sourceTree = \"<group>\"; };\n\t\t36CE2B521C93EA740084CE64 /* ProgressView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProgressView.swift; sourceTree = \"<group>\"; };\n\t\t36CE2B531C93EA740084CE64 /* ProgressViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProgressViewController.swift; sourceTree = \"<group>\"; };\n\t\t36CE2B541C93EA740084CE64 /* Property.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Property.swift; sourceTree = \"<group>\"; };\n\t\t36CE2B561C93EA740084CE64 /* BlueDarkStyle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BlueDarkStyle.swift; sourceTree = \"<group>\"; };\n\t\t36CE2B571C93EA740084CE64 /* BlueIndicatorStyle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BlueIndicatorStyle.swift; sourceTree = \"<group>\"; };\n\t\t36CE2B581C93EA740084CE64 /* GreenLightStyle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GreenLightStyle.swift; sourceTree = \"<group>\"; };\n\t\t36CE2B591C93EA740084CE64 /* OrangeClearStyle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OrangeClearStyle.swift; sourceTree = \"<group>\"; };\n\t\t36CE2B5A1C93EA740084CE64 /* Style.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Style.swift; sourceTree = \"<group>\"; };\n\t\t36CE2B5C1C93EA740084CE64 /* ColorUtil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ColorUtil.swift; sourceTree = \"<group>\"; };\n\t\t36F742BB1B3A7016003D799C /* GradientCircularProgress.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GradientCircularProgress.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t36F742BE1B3A7016003D799C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t36F742BF1B3A7016003D799C /* GradientCircularProgress.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GradientCircularProgress.h; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t36CC1C791B37083E009DE1F8 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t36F742D21B3A7016003D799C /* GradientCircularProgress.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t36CC1C8E1B37083E009DE1F8 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t36F742B71B3A7016003D799C /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t366555DA1C9D8BB600767B90 /* libs */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t362C51F81C9AB926008C1C81 /* AlertHelperKit.swift */,\n\t\t\t\t3632ED241C7833CD006484E5 /* AsyncUtil.swift */,\n\t\t\t\t366555DD1C9D900F00767B90 /* MyButton.swift */,\n\t\t\t);\n\t\t\tname = libs;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t36CC1C731B37083E009DE1F8 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t36CC1C7E1B37083E009DE1F8 /* GCProgressSample */,\n\t\t\t\t36CC1C941B37083E009DE1F8 /* GCProgressSampleTests */,\n\t\t\t\t36F742BC1B3A7016003D799C /* GradientCircularProgress */,\n\t\t\t\t36CC1C7D1B37083E009DE1F8 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t36CC1C7D1B37083E009DE1F8 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t36CC1C7C1B37083E009DE1F8 /* GCProgressSample.app */,\n\t\t\t\t36CC1C911B37083E009DE1F8 /* GCProgressSampleTests.xctest */,\n\t\t\t\t36F742BB1B3A7016003D799C /* GradientCircularProgress.framework */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t36CC1C7E1B37083E009DE1F8 /* GCProgressSample */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t366555DA1C9D8BB600767B90 /* libs */,\n\t\t\t\t36CC1C811B37083E009DE1F8 /* AppDelegate.swift */,\n\t\t\t\t36CC1C831B37083E009DE1F8 /* ViewController.swift */,\n\t\t\t\t368F0E4D1C35319E008B1AC4 /* MyStyle.swift */,\n\t\t\t\t360F44AA1DF27B2800835EA0 /* BackgroundTransparentStyle.swift */,\n\t\t\t\t36CC1C851B37083E009DE1F8 /* Main.storyboard */,\n\t\t\t\t36CC1C881B37083E009DE1F8 /* Images.xcassets */,\n\t\t\t\t36CC1C8A1B37083E009DE1F8 /* LaunchScreen.xib */,\n\t\t\t\t36CC1C7F1B37083E009DE1F8 /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = GCProgressSample;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t36CC1C7F1B37083E009DE1F8 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t36CC1C801B37083E009DE1F8 /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t36CC1C941B37083E009DE1F8 /* GCProgressSampleTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t36CC1C971B37083E009DE1F8 /* GCProgressSampleTests.swift */,\n\t\t\t\t36CC1C951B37083E009DE1F8 /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = GCProgressSampleTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t36CC1C951B37083E009DE1F8 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t36CC1C961B37083E009DE1F8 /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t36CE2B481C93EA740084CE64 /* Progress */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t36CE2B491C93EA740084CE64 /* Core */,\n\t\t\t\t36CE2B4C1C93EA740084CE64 /* Elements */,\n\t\t\t\t36CE2B521C93EA740084CE64 /* ProgressView.swift */,\n\t\t\t\t36CE2B531C93EA740084CE64 /* ProgressViewController.swift */,\n\t\t\t\t36CE2B541C93EA740084CE64 /* Property.swift */,\n\t\t\t);\n\t\t\tpath = Progress;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t36CE2B491C93EA740084CE64 /* Core */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t36CE2B4A1C93EA740084CE64 /* CircularProgressView.swift */,\n\t\t\t\t36CE2B4B1C93EA740084CE64 /* ProgressAtRatioView.swift */,\n\t\t\t);\n\t\t\tpath = Core;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t36CE2B4C1C93EA740084CE64 /* Elements */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t36CE2B4D1C93EA740084CE64 /* ArcView.swift */,\n\t\t\t\t36CE2B4E1C93EA740084CE64 /* Background.swift */,\n\t\t\t\t3667E0EC23392FEC002CCD9C /* WindowBuilder.swift */,\n\t\t\t\t36CE2B501C93EA740084CE64 /* GradientArcView.swift */,\n\t\t\t\t36CE2B511C93EA740084CE64 /* GradientArcWithClearColorView.swift */,\n\t\t\t);\n\t\t\tpath = Elements;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t36CE2B551C93EA740084CE64 /* Styles */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t36CE2B561C93EA740084CE64 /* BlueDarkStyle.swift */,\n\t\t\t\t36CE2B571C93EA740084CE64 /* BlueIndicatorStyle.swift */,\n\t\t\t\t36CE2B581C93EA740084CE64 /* GreenLightStyle.swift */,\n\t\t\t\t36CE2B591C93EA740084CE64 /* OrangeClearStyle.swift */,\n\t\t\t\t36CE2B5A1C93EA740084CE64 /* Style.swift */,\n\t\t\t);\n\t\t\tpath = Styles;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t36CE2B5B1C93EA740084CE64 /* Utils */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t36CE2B5C1C93EA740084CE64 /* ColorUtil.swift */,\n\t\t\t);\n\t\t\tpath = Utils;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t36F742BC1B3A7016003D799C /* GradientCircularProgress */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t36CE2B471C93EA740084CE64 /* GradientCircularProgress.swift */,\n\t\t\t\t36CE2B481C93EA740084CE64 /* Progress */,\n\t\t\t\t36CE2B551C93EA740084CE64 /* Styles */,\n\t\t\t\t36CE2B5B1C93EA740084CE64 /* Utils */,\n\t\t\t\t36F742BF1B3A7016003D799C /* GradientCircularProgress.h */,\n\t\t\t\t36F742BD1B3A7016003D799C /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = GradientCircularProgress;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t36F742BD1B3A7016003D799C /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t36F742BE1B3A7016003D799C /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t36F742B81B3A7016003D799C /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t36F742C01B3A7016003D799C /* GradientCircularProgress.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t36CC1C7B1B37083E009DE1F8 /* GCProgressSample */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 36CC1C9B1B37083E009DE1F8 /* Build configuration list for PBXNativeTarget \"GCProgressSample\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t36CC1C781B37083E009DE1F8 /* Sources */,\n\t\t\t\t36CC1C791B37083E009DE1F8 /* Frameworks */,\n\t\t\t\t36CC1C7A1B37083E009DE1F8 /* Resources */,\n\t\t\t\t36F742D91B3A7016003D799C /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t36F742D11B3A7016003D799C /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = GCProgressSample;\n\t\t\tproductName = GCProgressSample;\n\t\t\tproductReference = 36CC1C7C1B37083E009DE1F8 /* GCProgressSample.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t36CC1C901B37083E009DE1F8 /* GCProgressSampleTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 36CC1C9E1B37083E009DE1F8 /* Build configuration list for PBXNativeTarget \"GCProgressSampleTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t36CC1C8D1B37083E009DE1F8 /* Sources */,\n\t\t\t\t36CC1C8E1B37083E009DE1F8 /* Frameworks */,\n\t\t\t\t36CC1C8F1B37083E009DE1F8 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t36CC1C931B37083E009DE1F8 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = GCProgressSampleTests;\n\t\t\tproductName = GCProgressSampleTests;\n\t\t\tproductReference = 36CC1C911B37083E009DE1F8 /* GCProgressSampleTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\t36F742BA1B3A7016003D799C /* GradientCircularProgress */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 36F742D81B3A7016003D799C /* Build configuration list for PBXNativeTarget \"GradientCircularProgress\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t36F742B61B3A7016003D799C /* Sources */,\n\t\t\t\t36F742B71B3A7016003D799C /* Frameworks */,\n\t\t\t\t36F742B81B3A7016003D799C /* Headers */,\n\t\t\t\t36F742B91B3A7016003D799C /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = GradientCircularProgress;\n\t\t\tproductName = GradientCircularProgress;\n\t\t\tproductReference = 36F742BB1B3A7016003D799C /* GradientCircularProgress.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t36CC1C741B37083E009DE1F8 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftMigration = 0700;\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 1100;\n\t\t\t\tORGANIZATIONNAME = keygx;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t36CC1C7B1B37083E009DE1F8 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.3.2;\n\t\t\t\t\t\tDevelopmentTeam = 3CCNMX7TC9;\n\t\t\t\t\t\tDevelopmentTeamName = \"Yukihiko Kagiyama\";\n\t\t\t\t\t\tLastSwiftMigration = 1020;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t\t36CC1C901B37083E009DE1F8 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.3.2;\n\t\t\t\t\t\tLastSwiftMigration = 0800;\n\t\t\t\t\t\tTestTargetID = 36CC1C7B1B37083E009DE1F8;\n\t\t\t\t\t};\n\t\t\t\t\t36F742BA1B3A7016003D799C = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.3.2;\n\t\t\t\t\t\tDevelopmentTeamName = \"Yukihiko Kagiyama\";\n\t\t\t\t\t\tLastSwiftMigration = 1020;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 36CC1C771B37083E009DE1F8 /* Build configuration list for PBXProject \"GCProgressSample\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 36CC1C731B37083E009DE1F8;\n\t\t\tproductRefGroup = 36CC1C7D1B37083E009DE1F8 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t36CC1C7B1B37083E009DE1F8 /* GCProgressSample */,\n\t\t\t\t36CC1C901B37083E009DE1F8 /* GCProgressSampleTests */,\n\t\t\t\t36F742BA1B3A7016003D799C /* GradientCircularProgress */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t36CC1C7A1B37083E009DE1F8 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t36CC1C871B37083E009DE1F8 /* Main.storyboard in Resources */,\n\t\t\t\t36CC1C8C1B37083E009DE1F8 /* LaunchScreen.xib in Resources */,\n\t\t\t\t36CC1C891B37083E009DE1F8 /* Images.xcassets in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t36CC1C8F1B37083E009DE1F8 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t36F742B91B3A7016003D799C /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t36CC1C781B37083E009DE1F8 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t36CC1C841B37083E009DE1F8 /* ViewController.swift in Sources */,\n\t\t\t\t362C51F91C9AB926008C1C81 /* AlertHelperKit.swift in Sources */,\n\t\t\t\t360F44AB1DF27B2800835EA0 /* BackgroundTransparentStyle.swift in Sources */,\n\t\t\t\t36CC1C821B37083E009DE1F8 /* AppDelegate.swift in Sources */,\n\t\t\t\t3632ED251C7833CD006484E5 /* AsyncUtil.swift in Sources */,\n\t\t\t\t368F0E4E1C35319E008B1AC4 /* MyStyle.swift in Sources */,\n\t\t\t\t366555DE1C9D900F00767B90 /* MyButton.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t36CC1C8D1B37083E009DE1F8 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t36CC1C981B37083E009DE1F8 /* GCProgressSampleTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t36F742B61B3A7016003D799C /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t36CE2B5F1C93EA740084CE64 /* ProgressAtRatioView.swift in Sources */,\n\t\t\t\t3667E0ED23392FEC002CCD9C /* WindowBuilder.swift in Sources */,\n\t\t\t\t36CE2B681C93EA740084CE64 /* BlueDarkStyle.swift in Sources */,\n\t\t\t\t36CE2B601C93EA740084CE64 /* ArcView.swift in Sources */,\n\t\t\t\t36CE2B671C93EA740084CE64 /* Property.swift in Sources */,\n\t\t\t\t36CE2B5E1C93EA740084CE64 /* CircularProgressView.swift in Sources */,\n\t\t\t\t36CE2B5D1C93EA740084CE64 /* GradientCircularProgress.swift in Sources */,\n\t\t\t\t36CE2B631C93EA740084CE64 /* GradientArcView.swift in Sources */,\n\t\t\t\t36CE2B6C1C93EA740084CE64 /* Style.swift in Sources */,\n\t\t\t\t36CE2B661C93EA740084CE64 /* ProgressViewController.swift in Sources */,\n\t\t\t\t36CE2B611C93EA740084CE64 /* Background.swift in Sources */,\n\t\t\t\t36CE2B641C93EA740084CE64 /* GradientArcWithClearColorView.swift in Sources */,\n\t\t\t\t36CE2B6B1C93EA740084CE64 /* OrangeClearStyle.swift in Sources */,\n\t\t\t\t36CE2B651C93EA740084CE64 /* ProgressView.swift in Sources */,\n\t\t\t\t36CE2B6A1C93EA740084CE64 /* GreenLightStyle.swift in Sources */,\n\t\t\t\t36CE2B691C93EA740084CE64 /* BlueIndicatorStyle.swift in Sources */,\n\t\t\t\t36CE2B6D1C93EA740084CE64 /* ColorUtil.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t36CC1C931B37083E009DE1F8 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 36CC1C7B1B37083E009DE1F8 /* GCProgressSample */;\n\t\t\ttargetProxy = 36CC1C921B37083E009DE1F8 /* PBXContainerItemProxy */;\n\t\t};\n\t\t36F742D11B3A7016003D799C /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 36F742BA1B3A7016003D799C /* GradientCircularProgress */;\n\t\t\ttargetProxy = 36F742D01B3A7016003D799C /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t36CC1C851B37083E009DE1F8 /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t36CC1C861B37083E009DE1F8 /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t36CC1C8A1B37083E009DE1F8 /* LaunchScreen.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t36CC1C8B1B37083E009DE1F8 /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t36CC1C991B37083E009DE1F8 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tBITCODE_GENERATION_MODE = marker;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = \"\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t36CC1C9A1B37083E009DE1F8 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tBITCODE_GENERATION_MODE = bitcode;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Distribution\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_VERSION = \"\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t36CC1C9C1B37083E009DE1F8 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 3.13.0;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/GCProgressSample\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = GCProgressSample/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tMARKETING_VERSION = 3.13.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.keygraphix.ios.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE = \"\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t36CC1C9D1B37083E009DE1F8 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Distribution\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Distribution\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 3.13.0;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/GCProgressSample\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = GCProgressSample/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tMARKETING_VERSION = 3.13.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.keygraphix.ios.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t36CC1C9F1B37083E009DE1F8 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = GCProgressSampleTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.keygraphix.ios.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/GCProgressSample.app/GCProgressSample\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t36CC1CA01B37083E009DE1F8 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tINFOPLIST_FILE = GCProgressSampleTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.keygraphix.ios.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/GCProgressSample.app/GCProgressSample\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t36F742D41B3A7016003D799C /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 3.13.0;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = GradientCircularProgress/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMARKETING_VERSION = 3.13.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.keygraphix.ios.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t36F742D51B3A7016003D799C /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 3.13.0;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tINFOPLIST_FILE = GradientCircularProgress/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMARKETING_VERSION = 3.13.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.keygraphix.ios.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t36CC1C771B37083E009DE1F8 /* Build configuration list for PBXProject \"GCProgressSample\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t36CC1C991B37083E009DE1F8 /* Debug */,\n\t\t\t\t36CC1C9A1B37083E009DE1F8 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t36CC1C9B1B37083E009DE1F8 /* Build configuration list for PBXNativeTarget \"GCProgressSample\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t36CC1C9C1B37083E009DE1F8 /* Debug */,\n\t\t\t\t36CC1C9D1B37083E009DE1F8 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t36CC1C9E1B37083E009DE1F8 /* Build configuration list for PBXNativeTarget \"GCProgressSampleTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t36CC1C9F1B37083E009DE1F8 /* Debug */,\n\t\t\t\t36CC1CA01B37083E009DE1F8 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t36F742D81B3A7016003D799C /* Build configuration list for PBXNativeTarget \"GradientCircularProgress\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t36F742D41B3A7016003D799C /* Debug */,\n\t\t\t\t36F742D51B3A7016003D799C /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 36CC1C741B37083E009DE1F8 /* Project object */;\n}\n"
  },
  {
    "path": "GCProgressSample/GCProgressSample.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:GCProgressSample.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "GCProgressSample/GCProgressSample.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "GCProgressSample/GCProgressSample.xcodeproj/xcshareddata/xcschemes/GradientCircularProgress.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1100\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"36F742BA1B3A7016003D799C\"\n               BuildableName = \"GradientCircularProgress.framework\"\n               BlueprintName = \"GradientCircularProgress\"\n               ReferencedContainer = \"container:GCProgressSample.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"36F742BA1B3A7016003D799C\"\n            BuildableName = \"GradientCircularProgress.framework\"\n            BlueprintName = \"GradientCircularProgress\"\n            ReferencedContainer = \"container:GCProgressSample.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"36F742BA1B3A7016003D799C\"\n            BuildableName = \"GradientCircularProgress.framework\"\n            BlueprintName = \"GradientCircularProgress\"\n            ReferencedContainer = \"container:GCProgressSample.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "GCProgressSample/GCProgressSampleTests/GCProgressSampleTests.swift",
    "content": "//\n//  GCProgressSampleTests.swift\n//  GCProgressSampleTests\n//\n//  Created by keygx on 2015/06/21.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\n\nimport UIKit\nimport XCTest\n\nclass GCProgressSampleTests: XCTestCase {\n    \n    override func setUp() {\n        super.setUp()\n        // Put setup code here. This method is called before the invocation of each test method in the class.\n    }\n    \n    override func tearDown() {\n        // Put teardown code here. This method is called after the invocation of each test method in the class.\n        super.tearDown()\n    }\n    \n    func testExample() {\n        // This is an example of a functional test case.\n        XCTAssert(true, \"Pass\")\n    }\n    \n    func testPerformanceExample() {\n        // This is an example of a performance test case.\n        self.measure() {\n            // Put the code you want to measure the time of here.\n        }\n    }\n    \n}\n"
  },
  {
    "path": "GCProgressSample/GCProgressSampleTests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "GCProgressSample/GradientCircularProgress/GradientCircularProgress.h",
    "content": "//\n//  GradientCircularProgress.h\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/06/24.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n//! Project version number for GradientCircularProgress.\nFOUNDATION_EXPORT double GradientCircularProgressVersionNumber;\n\n//! Project version string for GradientCircularProgress.\nFOUNDATION_EXPORT const unsigned char GradientCircularProgressVersionString[];\n\n// In this header, you should import all the public headers of your framework using statements like #import <GradientCircularProgress/PublicHeader.h>\n\n\n"
  },
  {
    "path": "GCProgressSample/GradientCircularProgress/GradientCircularProgress.swift",
    "content": "//\n//  GradientCircularProgress.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/07/29.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\n\nimport UIKit\n\npublic class GradientCircularProgress {\n    \n    private var baseWindow: UIWindow?\n    private var progressViewController: ProgressViewController?\n    private var progressView: ProgressView?\n    private var property: Property?\n    \n    public var isAvailable: Bool = false\n    \n    public init() {}\n}\n\n// MARK: Common\nextension GradientCircularProgress {\n    \n    public func updateMessage(message: String) {\n        if !isAvailable {\n            return\n        }\n        \n        // Use addSubView\n        if let v = progressView {\n            v.updateMessage(message)\n        }\n        \n        // Use UIWindow\n        if let vc = progressViewController {\n            vc.updateMessage(message: message)\n        }\n    }\n    \n    public func updateRatio(_ ratio: CGFloat) {\n        if !isAvailable {\n            return\n        }\n        \n        // Use addSubView\n        if let v = progressView {\n            v.ratio = ratio\n        }\n        \n        // Use UIWindow\n        if let vc = progressViewController {\n            vc.ratio = ratio\n        }\n    }\n}\n\n// MARK: Use UIWindow\nextension GradientCircularProgress {\n    \n    public func showAtRatio(display: Bool = true, style: StyleProperty = Style()) {\n        if isAvailable {\n            return\n        }\n        isAvailable = true\n        property = Property(style: style)\n        \n        getProgressAtRatio(display: display, style: style)\n    }\n    \n    private func getProgressAtRatio(display: Bool, style: StyleProperty) {\n        baseWindow = WindowBuilder.build()\n        progressViewController = ProgressViewController()\n        \n        guard let win = baseWindow, let vc = progressViewController else {\n            return\n        }\n        \n        win.rootViewController = vc\n        win.backgroundColor = UIColor.clear\n        vc.arc(display: display, style: style, baseWindow: baseWindow)\n    }\n    \n    public func show(style: StyleProperty = Style()) {\n        if isAvailable {\n            return\n        }\n        isAvailable = true\n        property = Property(style: style)\n        \n        getProgress(message: nil, style: style)\n    }\n    \n    public func show(message: String, style: StyleProperty = Style()) {\n        if isAvailable {\n            return\n        }\n        isAvailable = true\n        property = Property(style: style)\n        \n        getProgress(message: message, style: style)\n    }\n    \n    private func getProgress(message: String?, style: StyleProperty) {\n        baseWindow = WindowBuilder.build()\n        progressViewController = ProgressViewController()\n        \n        guard let win = baseWindow, let vc = progressViewController else {\n            return\n        }\n        \n        win.rootViewController = vc\n        win.backgroundColor = UIColor.clear\n        vc.circle(message: message, style: style, baseWindow: baseWindow)\n    }\n    \n    public func dismiss() {\n        if !isAvailable {\n            return\n        }\n        \n        guard let prop = property else {\n            return\n        }\n        \n        if let vc = progressViewController {\n            vc.dismiss(prop.dismissTimeInterval!)\n        }\n        \n        cleanup(prop.dismissTimeInterval!, completionHandler: nil)\n        \n    }\n    \n    public func dismiss(_ completionHandler: @escaping () -> Void) -> () {\n        if !isAvailable {\n            return\n        }\n        \n        guard let prop = property else {\n            return\n        }\n        \n        if let vc = progressViewController {\n            vc.dismiss(prop.dismissTimeInterval!)\n        }\n        \n        cleanup(prop.dismissTimeInterval!) {\n            completionHandler()\n        }\n    }\n    \n    private func cleanup(_ t: Double, completionHandler: (() -> Void)?) {\n        let delay = t * Double(NSEC_PER_SEC)\n        let time  = DispatchTime.now() + Double(Int64(delay)) / Double(NSEC_PER_SEC)\n        \n        DispatchQueue.main.asyncAfter(deadline: time) { [weak self] in\n            guard let win = self?.baseWindow else {\n                return\n            }\n            \n            UIView.animate(\n                withDuration: 0.3,\n                animations: {\n                    win.alpha = 0\n                },\n                completion: { finished in\n                    self?.progressViewController = nil\n                    win.isHidden = true\n                    win.rootViewController = nil\n                    self?.baseWindow = nil\n                    self?.property = nil\n                    self?.isAvailable = false\n                    guard let completionHandler = completionHandler else {\n                        return\n                    }\n                    completionHandler()\n                }\n            )\n        }\n    }\n}\n\n// MARK: Use addSubView\nextension GradientCircularProgress {\n    \n    public func showAtRatio(frame: CGRect, display: Bool = true, style: StyleProperty = Style()) -> UIView? {\n        if isAvailable {\n            return nil\n        }\n        isAvailable = true\n        property = Property(style: style)\n        \n        progressView = ProgressView(frame: frame)\n        \n        guard let v = progressView else {\n            return nil\n        }\n        \n        v.arc(display, style: style)\n        \n        return v\n    }\n    \n    public func show(frame: CGRect, style: StyleProperty = Style()) -> UIView? {\n        if isAvailable {\n            return nil\n        }\n        isAvailable = true\n        property = Property(style: style)\n        \n        return getProgress(frame: frame, message: nil, style: style)\n    }\n    \n    public func show(frame: CGRect, message: String, style: StyleProperty = Style()) -> UIView? {\n        if isAvailable {\n            return nil\n        }\n        isAvailable = true\n        property = Property(style: style)\n        \n        return getProgress(frame: frame, message: message, style: style)\n    }\n    \n    private func getProgress(frame: CGRect, message: String?, style: StyleProperty) -> UIView? {\n        \n        progressView = ProgressView(frame: frame)\n        \n        guard let v = progressView else {\n            return nil\n        }\n        \n        v.circle(message, style: style)\n        \n        return v\n    }\n    \n    public func dismiss(progress view: UIView) {\n        if !isAvailable {\n            return\n        }\n        \n        guard let prop = property else {\n            return\n        }\n        \n        cleanup(prop.dismissTimeInterval!, view: view, completionHandler: nil)\n    }\n    \n    public func dismiss(progress view: UIView, completionHandler: @escaping () -> Void) -> () {\n        if !isAvailable {\n            return\n        }\n        \n        guard let prop = property else {\n            return\n        }\n        \n        cleanup(prop.dismissTimeInterval!, view: view) {\n            completionHandler()\n        }\n    }\n    \n    private func cleanup(_ t: Double, view: UIView, completionHandler: (() -> Void)?) {\n        let delay = t * Double(NSEC_PER_SEC)\n        let time  = DispatchTime.now() + Double(Int64(delay)) / Double(NSEC_PER_SEC)\n        \n        DispatchQueue.main.asyncAfter(deadline: time) {\n            UIView.animate(\n                withDuration: 0.3,\n                animations: {\n                    view.alpha = 0\n                },\n                completion: { [weak self] finished in\n                    view.removeFromSuperview()\n                    self?.property = nil\n                    self?.isAvailable = false\n                    guard let completionHandler = completionHandler else {\n                        return\n                    }\n                    completionHandler()\n                }\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "GCProgressSample/GradientCircularProgress/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>$(MARKETING_VERSION)</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(CURRENT_PROJECT_VERSION)</string>\n\t<key>NSPrincipalClass</key>\n\t<string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "GCProgressSample/GradientCircularProgress/Progress/Core/CircularProgressView.swift",
    "content": "//\n//  CircularProgressView.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/06/24.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\n\nimport UIKit\n\nclass CircularProgressView: UIView {\n    \n    var prop: Property?\n    var messageLabel = UILabel()\n    var centerPoint: CGPoint?\n    \n    var message: String? {\n        willSet {\n            messageLabel.frame = frame\n            messageLabel.text = newValue\n            \n            guard let message = messageLabel.text else {\n                return\n            }\n            \n            // Attribute\n            let paragraphStyle = NSMutableParagraphStyle()\n            paragraphStyle.lineHeightMultiple = 1.2\n            paragraphStyle.alignment = NSTextAlignment.center\n            let attr = [NSAttributedString.Key.paragraphStyle: paragraphStyle]\n            let attributedString = NSMutableAttributedString(string: message, attributes: attr)\n            \n            messageLabel.attributedText = attributedString\n            messageLabel.sizeToFit()\n            \n            if centerPoint == nil {\n                centerPoint = center\n            }\n            \n            if let center = centerPoint {\n                messageLabel.center = center\n            }\n        }\n    }\n    \n    var gradientLayer = CALayer()\n    \n    private struct Animation {\n        var rotationZ: CABasicAnimation {\n            let animation: CABasicAnimation = CABasicAnimation(keyPath: \"transform.rotation.z\")\n            animation.duration = 0.8\n            animation.repeatCount = HUGE\n            animation.fromValue = NSNumber(value: 0.0)\n            animation.toValue = NSNumber(value: 2 * Float.pi)\n            \n            return animation\n        }\n        \n        init() {}\n        \n        func start(_ layer: CALayer) {\n            layer.add(rotationZ, forKey: \"rotate\")\n        }\n        \n        func stop(_ layer: CALayer) {\n            layer.removeAllAnimations()\n        }\n    }\n    \n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        \n        backgroundColor = UIColor.clear\n        layer.masksToBounds = true\n        \n        NotificationCenter.default.addObserver(self,\n                                               selector: #selector(viewDidEnterBackground(_:)),\n                                               name: UIApplication.didEnterBackgroundNotification,\n                                               object: nil)\n        NotificationCenter.default.addObserver(self,\n                                               selector: #selector(viewWillEnterForeground(_:)),\n                                               name: UIApplication.willEnterForegroundNotification,\n                                               object: nil)\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    deinit {\n        NotificationCenter.default.removeObserver(self)\n    }\n    \n    override func didMoveToWindow() {\n        super.didMoveToWindow()\n        if window != nil {\n            Animation().start(gradientLayer)\n        } else {\n            Animation().stop(gradientLayer)\n        }\n    }\n    \n    @objc private func viewDidEnterBackground(_ notification: Notification?) {\n        Animation().stop(gradientLayer)\n    }\n    \n    @objc private func viewWillEnterForeground(_ notification: Notification?) {\n        Animation().start(gradientLayer)\n    }\n    \n    internal func initialize(frame: CGRect) {\n        \n        guard let prop = prop else {\n            return\n        }\n        \n        let rect: CGRect = CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height)\n        \n        // Base Circular\n        if let baseLineWidth = prop.baseLineWidth, let baseArcColor = prop.baseArcColor {\n            let circular: ArcView = ArcView(frame: rect, lineWidth: baseLineWidth)\n            circular.color = baseArcColor\n            circular.prop = prop\n            addSubview(circular)\n        }\n        \n        // Gradient Circular\n        if ColorUtil.toRGBA(color: prop.startArcColor).a < 1.0 || ColorUtil.toRGBA(color: prop.endArcColor).a < 1.0 {\n            // Clear Color\n            let gradient: UIView = GradientArcWithClearColorView().draw(rect: rect, prop: prop)\n            addSubview(gradient)\n            \n            gradientLayer = gradient.layer\n            Animation().start(gradientLayer)\n            \n        } else {\n            // Opaque Color\n            let gradient: GradientArcView = GradientArcView(frame: rect)\n            gradient.prop = prop\n            addSubview(gradient)\n            \n            gradientLayer = gradient.layer\n            Animation().start(gradientLayer)\n        }\n    }\n    \n    internal func showMessage(_ message: String) {\n        \n        guard let prop = prop else {\n            return\n        }\n        \n        // Message\n        messageLabel.font = prop.messageLabelFont\n        messageLabel.textAlignment = NSTextAlignment.center\n        messageLabel.textColor = prop.messageLabelFontColor\n        messageLabel.numberOfLines = 0\n\n        addSubview(messageLabel)\n        \n        self.message = message\n    }\n}\n"
  },
  {
    "path": "GCProgressSample/GradientCircularProgress/Progress/Core/ProgressAtRatioView.swift",
    "content": "//\n//  ProgressAtRatioView.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/06/24.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\n\nimport UIKit\n\nclass ProgressAtRatioView: UIView {\n    \n    internal var arcView: ArcView?\n    internal var prop: Property?\n    internal var ratioLabel: UILabel = UILabel()\n    \n    internal var ratio: CGFloat = 0.0 {\n        didSet {\n            ratioLabel.text = String(format:\"%.0f\", ratio * 100) + \"%\"\n        }\n    }\n    \n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        \n        backgroundColor = UIColor.clear\n        layer.masksToBounds = true\n    }\n\n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    internal func initialize(frame: CGRect) {\n        \n        guard let prop = prop else {\n            return\n        }\n        \n        let rect: CGRect = CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height)\n        \n        // Base Circular\n        if let baseLineWidth = prop.baseLineWidth, let baseArcColor = prop.baseArcColor {\n            let circular: ArcView = ArcView(frame: rect, lineWidth: baseLineWidth)\n            circular.prop = prop\n            circular.ratio = 1.0\n            circular.color = baseArcColor\n            circular.lineWidth = baseLineWidth\n            addSubview(circular)\n        }\n        \n        // Gradient Circular\n        if ColorUtil.toRGBA(color: prop.startArcColor).a < 1.0 || ColorUtil.toRGBA(color: prop.endArcColor).a < 1.0 {\n            // Clear Color\n            let gradient: UIView = GradientArcWithClearColorView().draw(rect: rect, prop: prop)\n            addSubview(gradient)\n            \n            masking(rect: rect, prop: prop, gradient: gradient)\n            \n        } else {\n            // Opaque Color\n            let gradient: GradientArcView = GradientArcView(frame: rect)\n            gradient.prop = prop\n            addSubview(gradient)\n            \n            masking(rect: rect, prop: prop, gradient: gradient)\n        }\n    }\n    \n    private func masking(rect: CGRect, prop: Property, gradient: UIView) {\n        // Mask\n        arcView = ArcView(frame: rect, lineWidth: prop.arcLineWidth)\n        \n        guard let mask = arcView else {\n            return\n        }\n        \n        mask.prop = prop\n        gradient.layer.mask = mask.layer\n    }\n    \n    override func draw(_ rect: CGRect) {\n        \n        guard let mask = arcView else {\n            return\n        }\n        \n        if ratio > 1.0 {\n            mask.ratio = 1.0\n        } else {\n            mask.ratio = ratio\n        }\n        mask.setNeedsDisplay()\n    }\n    \n    func showRatio() {\n        \n        guard let prop = prop else {\n            return\n        }\n        \n        // Progress Ratio\n        ratioLabel.text = \"          \"\n        ratioLabel.font = prop.ratioLabelFont\n        ratioLabel.textAlignment = NSTextAlignment.right\n        ratioLabel.textColor = prop.ratioLabelFontColor\n        ratioLabel.sizeToFit()\n        ratioLabel.center = center\n        \n        addSubview(ratioLabel)\n    }\n}\n"
  },
  {
    "path": "GCProgressSample/GradientCircularProgress/Progress/Elements/ArcView.swift",
    "content": "//\n//  Arc.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/06/24.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\n\nimport UIKit\n\nclass ArcView: UIView {\n    \n    var prop: Property?\n    var ratio: CGFloat = 1.0\n    var color: UIColor = UIColor.black\n    var lineWidth: CGFloat = 0.0\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    init(frame: CGRect, lineWidth: CGFloat) {\n        super.init(frame: frame)\n        \n        backgroundColor = UIColor.clear\n        layer.masksToBounds = true\n        \n        self.lineWidth = lineWidth\n    }\n    \n    override func draw(_ rect: CGRect) {\n        \n        drawArc(rect: rect)\n    }\n    \n    private func drawArc(rect: CGRect) {\n        \n        guard let prop = prop else {\n            return\n        }\n        \n        let circularRect: CGRect = prop.progressRect\n        \n        let arcPoint: CGPoint      = CGPoint(x: rect.width/2, y: rect.height/2)\n        let arcRadius: CGFloat     = circularRect.width/2 + prop.arcLineWidth/2\n        let arcStartAngle: CGFloat = -CGFloat.pi/2\n        let arcEndAngle: CGFloat   = ratio * 2.0 * CGFloat.pi - CGFloat.pi/2\n        \n        let arc: UIBezierPath = UIBezierPath(arcCenter: arcPoint,\n                                             radius: arcRadius,\n                                             startAngle: arcStartAngle,\n                                             endAngle: arcEndAngle,\n                                             clockwise: true)\n        \n        color.setStroke()\n        \n        arc.lineWidth = lineWidth\n        arc.lineCapStyle = prop.arcLineCapStyle\n        arc.stroke()\n    }\n}\n"
  },
  {
    "path": "GCProgressSample/GradientCircularProgress/Progress/Elements/Background.swift",
    "content": "//\n//  Background.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/06/24.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\n\n\nstruct Background {\n    \n    internal func blurEffectView(fromBlurStyle style: BackgroundStyles, frame: CGRect) -> UIVisualEffectView? {\n        \n        var blurView: UIVisualEffectView?\n        \n        // return (blurEffectStyle: UIBlurEffectStyle?, isUserInteraction: Bool)\n        let backgroundStyle = getStyle(style)\n        \n        if let blur = backgroundStyle.blurEffectStyle {\n            // UIBlurEffectStyle (.extraLight, .light, .dark)\n            let effect = UIBlurEffect(style: blur)\n            blurView = UIVisualEffectView(effect: effect)\n        \n        } else {\n            if !backgroundStyle.isUserInteraction {\n                // .transparent\n                blurView = UIVisualEffectView(effect: nil)\n            }\n        }\n        \n        blurView?.frame = frame\n        return blurView\n    }\n    \n    private func getStyle(_ style: BackgroundStyles) -> (blurEffectStyle: UIBlurEffect.Style?, isUserInteraction: Bool) {\n        switch style {\n        case .extraLight:\n            return (.extraLight, false)\n        case .light:\n            return (.light, false)\n        case .dark:\n            return (.dark, false)\n        case .transparent:\n            return (nil, false)\n        default:\n            // .none\n            return (nil, true)\n        }\n    }\n}\n"
  },
  {
    "path": "GCProgressSample/GradientCircularProgress/Progress/Elements/GradientArcView.swift",
    "content": "//\n//  GradientArcView.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/06/24.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\n\nimport UIKit\n\nclass GradientArcView: UIView {\n    \n    internal var prop: Property?\n    \n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        \n        backgroundColor = UIColor.clear\n        layer.masksToBounds = true\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func getGradientPointColor(ratio: CGFloat, startColor: UIColor, endColor: UIColor) -> UIColor {\n        \n        let sColor = ColorUtil.toRGBA(color: startColor)\n        let eColor = ColorUtil.toRGBA(color: endColor)\n        \n        let r = (eColor.r - sColor.r) * ratio + sColor.r\n        let g = (eColor.g - sColor.g) * ratio + sColor.g\n        let b = (eColor.b - sColor.b) * ratio + sColor.b\n        let a = (eColor.a - sColor.a) * ratio + sColor.a\n        \n        return UIColor(red: r, green: g, blue: b, alpha: a)\n    }\n    \n    override func draw(_ rect: CGRect) {\n        \n        guard let prop = prop else {\n            return\n        }\n        \n        let circularRect: CGRect = prop.progressRect\n        \n        var currentAngle: CGFloat = 0.0\n        \n        for i in stride(from:CGFloat(0.0), through: CGFloat(1.0), by: CGFloat(0.005)) {\n            \n            let arcPoint: CGPoint = CGPoint(x: rect.width/2, y: rect.height/2)\n            let arcRadius: CGFloat = circularRect.width/2 + prop.arcLineWidth/2\n            let arcStartAngle: CGFloat = -CGFloat.pi/2\n            let arcEndAngle: CGFloat = i * 2.0 * CGFloat.pi - CGFloat.pi/2\n            \n            if currentAngle == 0.0 {\n                currentAngle = arcStartAngle\n            } else {\n                currentAngle = arcEndAngle - 0.05\n            }\n            \n            let arc: UIBezierPath = UIBezierPath(arcCenter: arcPoint,\n                                                 radius: arcRadius,\n                                                 startAngle: currentAngle,\n                                                 endAngle: arcEndAngle,\n                                                 clockwise: true)\n            \n            let strokeColor: UIColor = getGradientPointColor(ratio: i, startColor: prop.startArcColor, endColor: prop.endArcColor)\n            strokeColor.setStroke()\n            \n            arc.lineWidth = prop.arcLineWidth\n            arc.lineCapStyle = prop.arcLineCapStyle\n            arc.stroke()\n        }\n    }\n}\n"
  },
  {
    "path": "GCProgressSample/GradientCircularProgress/Progress/Elements/GradientArcWithClearColorView.swift",
    "content": "//\n//  GradientArcWithClearColorView.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/11/20.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\n\nimport UIKit\n\nclass GradientArcWithClearColorView: UIView {\n    \n    internal func draw(rect: CGRect, prop: Property) -> UIImageView {\n        // Gradient Clear Circular\n        \n        /* Prop */\n        var startArcColorProp = prop\n        var endArcColorProp = prop\n        var startGradientMaskProp = prop\n        var endGradientMaskProp = prop\n        var solidMaskProp = prop\n        \n        // StartArc\n        startArcColorProp.endArcColor = ColorUtil.toNotOpacityColor(color: startArcColorProp.startArcColor)\n        \n        // EndArc\n        endArcColorProp.startArcColor = ColorUtil.toNotOpacityColor(color: endArcColorProp.endArcColor)\n        \n        // StartGradientMask\n        startGradientMaskProp.startArcColor = UIColor.black\n        startGradientMaskProp.endArcColor = UIColor.white\n        startGradientMaskProp.progressSize += 10.0\n        startGradientMaskProp.arcLineWidth += 20.0\n        \n        // EndGradientMask\n        endGradientMaskProp.startArcColor = UIColor.white\n        endGradientMaskProp.endArcColor = UIColor.black\n        endGradientMaskProp.progressSize += 10.0\n        endGradientMaskProp.arcLineWidth += 20.0\n\n        // SolidMask\n        solidMaskProp.startArcColor = UIColor.black\n        solidMaskProp.endArcColor   = UIColor.black\n        \n        /* Mask Image */\n        // StartArcColorImage\n        let startArcColorView = ArcView(frame: rect, lineWidth: startArcColorProp.arcLineWidth)\n        startArcColorView.color = startArcColorProp.startArcColor\n        startArcColorView.prop = startArcColorProp\n        let startArcColorImage = viewToUIImage(view: startArcColorView)!\n        \n        // StartGradientMaskImage\n        let startGradientMaskView = GradientArcView(frame: rect)\n        startGradientMaskView.prop = startGradientMaskProp\n        let startGradientMaskImage = viewToUIImage(view: startGradientMaskView)!\n        \n        // EndArcColorImage\n        let endArcColorView = ArcView(frame: rect, lineWidth: endArcColorProp.arcLineWidth)\n        endArcColorView.color = endArcColorProp.startArcColor\n        endArcColorView.prop = endArcColorProp\n        let endArcColorImage = viewToUIImage(view: endArcColorView)!\n        \n        // EndGradientMaskImage\n        let endGradientMaskView = GradientArcView(frame: rect)\n        endGradientMaskView.prop = endGradientMaskProp\n        let endGradientMaskImage = viewToUIImage(view: endGradientMaskView)!\n        \n        // SolidMaskImage\n        let solidMaskView = ArcView(frame: rect, lineWidth: solidMaskProp.arcLineWidth)\n        solidMaskView.prop = solidMaskProp\n        let solidMaskImage = viewToUIImage(view: solidMaskView)!\n        \n        /* Masking */\n        var startArcImage = mask(image: startGradientMaskImage, maskImage: solidMaskImage)\n        startArcImage = mask(image: startArcColorImage, maskImage: startArcImage)\n        \n        var endArcImage = mask(image: endGradientMaskImage, maskImage: solidMaskImage)\n        endArcImage = mask(image: endArcColorImage, maskImage: endArcImage)\n        \n        /* Composite */\n        let image: UIImage = composite(image1: startArcImage, image2: endArcImage, prop: prop)\n        \n        /* UIImageView */\n        let imageView = UIImageView(image: image)\n        imageView.contentMode = .scaleAspectFill\n        imageView.clipsToBounds = true\n        \n        return imageView\n    }\n    \n    internal func mask(image: UIImage, maskImage: UIImage) -> UIImage {\n        \n        let maskRef: CGImage = maskImage.cgImage!\n        let mask: CGImage = CGImage(\n            maskWidth: maskRef.width,\n            height: maskRef.height,\n            bitsPerComponent: maskRef.bitsPerComponent,\n            bitsPerPixel: maskRef.bitsPerPixel,\n            bytesPerRow: maskRef.bytesPerRow,\n            provider: maskRef.dataProvider!,\n            decode: nil,\n            shouldInterpolate: false)!\n        \n        let maskedImageRef: CGImage = image.cgImage!.masking(mask)!\n        let scale = UIScreen.main.scale\n        let maskedImage: UIImage = UIImage(cgImage: maskedImageRef, scale: scale, orientation: .up)\n        \n        return maskedImage\n    }\n    \n    internal func viewToUIImage(view: UIView) -> UIImage? {\n        \n        let scale = UIScreen.main.scale\n        UIGraphicsBeginImageContextWithOptions(view.frame.size, false, scale)\n        view.layer.render(in: UIGraphicsGetCurrentContext()!)\n        let image = UIGraphicsGetImageFromCurrentImageContext()\n        UIGraphicsEndImageContext()\n        \n        return image\n    }\n    \n    internal func composite(image1: UIImage, image2: UIImage, prop: Property) -> UIImage {\n        \n        let scale = UIScreen.main.scale\n        UIGraphicsBeginImageContextWithOptions(image1.size, false, scale)\n        image1.draw(\n            in: CGRect(x: 0, y: 0, width: image1.size.width, height: image1.size.height),\n            blendMode: .overlay,\n            alpha: ColorUtil.toRGBA(color: prop.startArcColor).a)\n        image2.draw(\n            in: CGRect(x: 0, y: 0, width: image2.size.width, height: image2.size.height),\n            blendMode: .overlay,\n            alpha: ColorUtil.toRGBA(color: prop.endArcColor).a)\n        let image = UIGraphicsGetImageFromCurrentImageContext()\n        UIGraphicsEndImageContext()\n        \n        return image!\n    }\n}\n"
  },
  {
    "path": "GCProgressSample/GradientCircularProgress/Progress/Elements/WindowBuilder.swift",
    "content": "//\n//  WindowBuilder.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2019/09/24.\n//  Copyright © 2019 keygx. All rights reserved.\n//\n\nimport UIKit\n\nclass WindowBuilder {\n    static func build() -> UIWindow? {\n        var baseWindow: UIWindow?\n        \n        if #available(iOS 13.0, *) {\n            let windowScene = UIApplication.shared.connectedScenes\n                                .filter { $0.activationState == .foregroundActive }.first\n            if let windowScene = windowScene as? UIWindowScene {\n                baseWindow = UIWindow(windowScene: windowScene)\n            } else {\n                baseWindow = UIWindow()\n            }\n        } else {\n            baseWindow = UIWindow()\n        }\n        \n        baseWindow?.bounds = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)\n        baseWindow?.backgroundColor = UIColor.clear\n        baseWindow?.windowLevel = UIWindow.Level.alert + 1\n        baseWindow?.makeKeyAndVisible()\n        \n        return baseWindow\n    }\n}\n"
  },
  {
    "path": "GCProgressSample/GradientCircularProgress/Progress/ProgressView.swift",
    "content": "//\n//  ProgressView.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2016/03/07.\n//  Copyright (c) 2016年 keygx. All rights reserved.\n//\n\nimport UIKit\n\nclass ProgressView: UIView {\n    \n    private var viewRect: CGRect?\n    private var blurView: UIVisualEffectView?\n    private var progressAtRatioView: ProgressAtRatioView?\n    private var circularProgressView: CircularProgressView?\n    internal var prop: Property?\n    \n    internal var ratio: CGFloat = 0.0 {\n        didSet {\n            progressAtRatioView?.ratio = ratio\n            progressAtRatioView?.setNeedsDisplay()\n        }\n    }\n    \n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        \n        initialize(frame: frame)\n    }\n    \n    required init(coder aDecoder: NSCoder) {\n        super.init(coder: aDecoder)!\n    }\n    \n    private func initialize(frame: CGRect) {\n        viewRect = CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height)\n        clipsToBounds = true\n    }\n    \n    internal func arc(_ display: Bool, style: StyleProperty) {\n        \n        prop = Property(style: style)\n        \n        guard let prop = prop else {\n            return\n        }\n        \n        isUserInteractionEnabled = !(prop.backgroundStyle.rawValue == 0) ? true : false\n        \n        getBlurView()\n        \n        progressAtRatioView = ProgressAtRatioView(frame: CGRect(x: 0, y: 0, width: prop.progressSize, height: prop.progressSize))\n        \n        guard let progressAtRatioView = progressAtRatioView else {\n            return\n        }\n        \n        progressAtRatioView.prop = prop\n        progressAtRatioView.initialize(frame: progressAtRatioView.frame)\n        \n        if display {\n            progressAtRatioView.showRatio()\n        }\n        \n        progressAtRatioView.frame = CGRect(\n            x: (frame.size.width - progressAtRatioView.frame.size.width) / 2,\n            y: (frame.size.height - progressAtRatioView.frame.size.height) / 2,\n            width: progressAtRatioView.frame.size.width,\n            height: progressAtRatioView.frame.size.height)\n        \n        addSubview(progressAtRatioView)\n    }\n    \n    internal func circle(_ message: String?, style: StyleProperty) {\n        \n        prop = Property(style: style)\n        \n        guard let prop = prop else {\n            return\n        }\n        \n        isUserInteractionEnabled = !(prop.backgroundStyle.rawValue == 0) ? true : false\n                \n        getBlurView()\n        \n        circularProgressView = CircularProgressView(frame: CGRect(x: 0, y: 0, width: prop.progressSize, height: prop.progressSize))\n        \n        guard let circularProgressView = circularProgressView else {\n            return\n        }\n        \n        circularProgressView.prop = prop\n        circularProgressView.initialize(frame: circularProgressView.frame)\n        \n        if let message = message {\n            circularProgressView.showMessage(message)\n        }\n        \n        circularProgressView.frame = CGRect(\n            x: (frame.size.width - circularProgressView.frame.size.width) / 2,\n            y: (frame.size.height - circularProgressView.frame.size.height) / 2,\n            width: circularProgressView.frame.size.width,\n            height: circularProgressView.frame.size.height)\n        \n        addSubview(circularProgressView)\n    }\n    \n    internal func updateMessage(_ message: String) {\n        \n        guard let circularProgressView = circularProgressView else {\n            return\n        }\n        \n        circularProgressView.message = message\n    }\n    \n    private func getBlurView() {\n        \n        guard let rect = viewRect, let prop = prop else {\n            return\n        }\n        \n        blurView = Background().blurEffectView(fromBlurStyle: prop.backgroundStyle, frame: rect)\n        \n        guard let blurView = blurView else {\n            return\n        }\n        \n        backgroundColor = UIColor.clear\n        addSubview(blurView)\n    }\n}\n"
  },
  {
    "path": "GCProgressSample/GradientCircularProgress/Progress/ProgressViewController.swift",
    "content": "//\n//  ProgressViewController.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/06/24.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\n\nimport UIKit\n\nclass ProgressViewController: UIViewController {\n    \n    private var viewRect: CGRect?\n    private var blurView: UIVisualEffectView?\n    private var progressAtRatioView: ProgressAtRatioView?\n    private var circularProgressView: CircularProgressView?\n    internal var prop: Property?\n    \n    internal var ratio: CGFloat = 0.0 {\n        didSet {\n            progressAtRatioView?.ratio = ratio\n            progressAtRatioView?.setNeedsDisplay()\n        }\n    }\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        view.backgroundColor = UIColor.clear\n    }\n    \n    override func didReceiveMemoryWarning() {\n        super.didReceiveMemoryWarning()\n    }\n    \n    override var shouldAutorotate: Bool {\n        return false\n    }\n    \n    override var prefersStatusBarHidden: Bool {\n        let orientation: UIInterfaceOrientation\n        if #available(iOS 13.0, *) {\n            orientation = UIApplication.shared.windows.first?.windowScene?.interfaceOrientation ?? .portrait\n        } else {\n            orientation = UIApplication.shared.statusBarOrientation\n        }\n        \n        switch orientation {\n        case .landscapeLeft, .landscapeRight:\n            // LandscapeLeft | LandscapeRight\n            return true\n        default:\n            // Unknown | Portrait | PortraitUpsideDown\n            return false\n        }\n    }\n    \n    private func getViewRect() {\n        \n        let window = UIWindow(frame: UIScreen.main.bounds)\n        \n        viewRect = window.frame\n    }\n    \n    private func getBlurView() {\n        \n        guard let rect = viewRect, let prop = prop else {\n            return\n        }\n        \n        blurView = Background().blurEffectView(fromBlurStyle: prop.backgroundStyle, frame: rect)\n        \n        guard let blurView = blurView else {\n            return\n        }\n        \n        view.backgroundColor = UIColor.clear\n        view.addSubview(blurView)\n    }\n    \n    internal func arc(display: Bool, style: StyleProperty, baseWindow: UIWindow?) {\n        \n        prop = Property(style: style)\n        \n        guard let win = baseWindow, let prop = prop else {\n            return\n        }\n        \n        win.isUserInteractionEnabled = !(prop.backgroundStyle.rawValue == 0) ? true : false // 0 == .None\n        \n        getViewRect()\n        \n        getBlurView()\n        \n        progressAtRatioView = ProgressAtRatioView(frame: CGRect(x: 0, y: 0, width: prop.progressSize, height: prop.progressSize))\n        \n        guard let progressAtRatioView = progressAtRatioView else {\n            return\n        }\n        \n        progressAtRatioView.prop = prop\n        progressAtRatioView.initialize(frame: progressAtRatioView.frame)\n        \n        if display {\n            progressAtRatioView.showRatio()\n        }\n        \n        progressAtRatioView.center = view.center\n        view.addSubview(progressAtRatioView)\n    }\n    \n    internal func circle(message: String?, style: StyleProperty, baseWindow: UIWindow?) {\n        \n        prop = Property(style: style)\n        \n        guard let win = baseWindow, let prop = prop else {\n            return\n        }\n        \n        win.isUserInteractionEnabled = !(prop.backgroundStyle.rawValue == 0) ? true : false // 0 == .None\n        \n        getViewRect()\n        \n        getBlurView()\n                \n        circularProgressView = CircularProgressView(frame: CGRect(x: 0, y: 0, width: prop.progressSize, height: prop.progressSize))\n        \n        guard let circularProgressView = circularProgressView else {\n            return\n        }\n        \n        circularProgressView.prop = prop\n        circularProgressView.initialize(frame: circularProgressView.frame)\n        \n        if message != nil {\n            circularProgressView.showMessage(message!)\n        }\n        \n        circularProgressView.center = view.center\n        view.addSubview(circularProgressView)\n    }\n    \n    internal func updateMessage(message: String) {\n        \n        guard let circularProgressView = circularProgressView else {\n            return\n        }\n        \n        circularProgressView.message = message\n    }\n  \n    internal func dismiss(_ t: Double) {\n        \n        let delay = t * Double(NSEC_PER_SEC)\n        let time  = DispatchTime.now() + Double(Int64(delay)) / Double(NSEC_PER_SEC)\n        \n        DispatchQueue.main.asyncAfter(deadline: time) {\n            guard let blurView = self.blurView, let progressAtRatioView = self.progressAtRatioView, let circularProgressView = self.circularProgressView else {\n                return\n            }\n            \n            UIView.animate(\n                withDuration: 0.3,\n                animations: {\n                    progressAtRatioView.alpha = 0.0\n                    circularProgressView.alpha = 0.0\n                },\n                completion: { finished in\n                    progressAtRatioView.removeFromSuperview()\n                    circularProgressView.removeFromSuperview()\n                    blurView.removeFromSuperview()\n                }\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "GCProgressSample/GradientCircularProgress/Progress/Property.swift",
    "content": "//\n//  Property.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/06/24.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\n\npublic protocol StyleProperty {\n    // Progress Size\n    var progressSize: CGFloat { get set }\n    \n    // Gradient Circular\n    var arcLineWidth: CGFloat { get set }\n    var startArcColor: UIColor { get set }\n    var endArcColor: UIColor { get set }\n    \n    // Base Circular\n    var baseLineWidth: CGFloat? { get set }\n    var baseArcColor: UIColor? { get set }\n    \n    // Ratio\n    var ratioLabelFont: UIFont? { get set }\n    var ratioLabelFontColor: UIColor? { get set }\n    \n    // Message\n    var messageLabelFont: UIFont? { get set }\n    var messageLabelFontColor: UIColor? { get set }\n    \n    // Background\n    var backgroundStyle: BackgroundStyles { get set }\n    \n    // Dismiss\n    var dismissTimeInterval: Double? { get set }\n    \n    // Initialize\n    init()\n}\n\npublic enum BackgroundStyles: Int {\n    case none = 0\n    case extraLight\n    case light\n    case dark\n    case transparent\n}\n\n\ninternal struct Property {\n    let margin: CGFloat = 5.0\n    let arcLineCapStyle: CGLineCap = CGLineCap.butt\n    \n    // Progress Size\n    var progressSize: CGFloat\n    \n    // Gradient Circular\n    var arcLineWidth: CGFloat\n    var startArcColor: UIColor\n    var endArcColor: UIColor\n    \n    // Base Circular\n    var baseLineWidth: CGFloat?\n    var baseArcColor: UIColor?\n    \n    // Ratio\n    let ratioLabelFont: UIFont?\n    let ratioLabelFontColor: UIColor?\n    \n    // Message\n    let messageLabelFont: UIFont?\n    let messageLabelFontColor: UIColor?\n    \n    // Background\n    let backgroundStyle: BackgroundStyles\n    \n    // Dismiss\n    let dismissTimeInterval: Double?\n    \n    // Progress Rect\n    var progressRect: CGRect {\n        let lineWidth: CGFloat = (arcLineWidth > baseLineWidth!) ? arcLineWidth : baseLineWidth!\n        return CGRect(x: 0, y: 0, width: progressSize - lineWidth * 2, height: progressSize - lineWidth * 2)\n    }\n    \n    init(style: StyleProperty) {\n        \n        let styles: StyleProperty = style\n        \n        progressSize          = styles.progressSize\n        arcLineWidth          = styles.arcLineWidth\n        startArcColor         = styles.startArcColor\n        endArcColor           = styles.endArcColor\n        baseLineWidth         = styles.baseLineWidth         ?? 0.0\n        baseArcColor          = styles.baseArcColor          ?? UIColor.clear\n        ratioLabelFont        = styles.ratioLabelFont        ?? UIFont.systemFont(ofSize: 16.0)\n        ratioLabelFontColor   = styles.ratioLabelFontColor   ?? UIColor.clear\n        messageLabelFont      = styles.messageLabelFont      ?? UIFont.systemFont(ofSize: 16.0)\n        messageLabelFontColor = styles.messageLabelFontColor ?? UIColor.clear\n        backgroundStyle       = styles.backgroundStyle\n        dismissTimeInterval   = styles.dismissTimeInterval    ?? 0.8\n    }\n}\n"
  },
  {
    "path": "GCProgressSample/GradientCircularProgress/Styles/BlueDarkStyle.swift",
    "content": "//\n//  BlueDarkStyle.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/08/31.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\nimport UIKit\n\npublic struct BlueDarkStyle: StyleProperty {\n    // Progress Size\n    public var progressSize: CGFloat = 260\n    \n    // Gradient Circular\n    public var arcLineWidth: CGFloat = 4.0\n    public var startArcColor: UIColor = ColorUtil.toUIColor(r: 0.0, g: 122.0, b: 255.0, a: 1.0)\n    public var endArcColor: UIColor = UIColor.cyan\n    \n    // Base Circular\n    public var baseLineWidth: CGFloat? = 5.0\n    public var baseArcColor: UIColor? = UIColor(red:0.0, green: 0.0, blue: 0.0, alpha: 0.2)\n    \n    // Ratio\n    public var ratioLabelFont: UIFont? = UIFont(name: \"Verdana-Bold\", size: 16.0)\n    public var ratioLabelFontColor: UIColor? = UIColor.white\n    \n    // Message\n    public var messageLabelFont: UIFont? = UIFont.systemFont(ofSize: 16.0)\n    public var messageLabelFontColor: UIColor? = UIColor.white\n    \n    // Background\n    public var backgroundStyle: BackgroundStyles = .dark\n    \n    // Dismiss\n    public var dismissTimeInterval: Double? = nil // 'nil' for default setting.\n    \n    public init() {}\n}\n"
  },
  {
    "path": "GCProgressSample/GradientCircularProgress/Styles/BlueIndicatorStyle.swift",
    "content": "//\n//  BlueIndicatorStyle.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/08/31.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\nimport UIKit\n\npublic struct BlueIndicatorStyle: StyleProperty {\n    // Progress Size\n    public var progressSize: CGFloat = 44\n    \n    // Gradient Circular\n    public var arcLineWidth: CGFloat = 4.0\n    public var startArcColor: UIColor = ColorUtil.toUIColor(r: 235.0, g: 245.0, b: 255.0, a: 1.0)\n    public var endArcColor: UIColor = ColorUtil.toUIColor(r: 0.0, g: 122.0, b: 255.0, a: 1.0)\n    \n    // Base Circular\n    public var baseLineWidth: CGFloat? = 4.0\n    public var baseArcColor: UIColor? = ColorUtil.toUIColor(r: 215.0, g: 215.0, b: 215.0, a: 0.4)\n    \n    // Ratio\n    public var ratioLabelFont: UIFont? = nil\n    public var ratioLabelFontColor: UIColor? = nil\n    \n    // Message\n    public var messageLabelFont: UIFont? = nil\n    public var messageLabelFontColor: UIColor? = nil\n    \n    // Background\n    public var backgroundStyle: BackgroundStyles = .none\n    \n    // Dismiss\n    public var dismissTimeInterval: Double? = nil // 'nil' for default setting.\n    \n    public init() {}\n}\n"
  },
  {
    "path": "GCProgressSample/GradientCircularProgress/Styles/GreenLightStyle.swift",
    "content": "//\n//  GreenLightStyle.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/11/24.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\nimport UIKit\n\npublic struct GreenLightStyle: StyleProperty {\n    // Progress Size\n    public var progressSize: CGFloat = 200\n    \n    // Gradient Circular\n    public var arcLineWidth: CGFloat = 32.0\n    public var startArcColor: UIColor = ColorUtil.toUIColor(r: 40.0, g: 110.0, b: 60.0, a: 1.0)\n    public var endArcColor: UIColor = UIColor.green\n    \n    // Base Circular\n    public var baseLineWidth: CGFloat? = 1.0\n    public var baseArcColor: UIColor? = UIColor(red:0.0, green: 0.0, blue: 0.0, alpha: 0.1)\n    \n    // Ratio\n    public var ratioLabelFont: UIFont? = UIFont(name: \"Verdana-Bold\", size: 18.0)\n    public var ratioLabelFontColor: UIColor? = UIColor.darkGray\n    \n    // Message\n    public var messageLabelFont: UIFont? = UIFont(name: \"Verdana\", size: 18.0)\n    public var messageLabelFontColor: UIColor? = UIColor.darkGray\n    \n    // Background\n    public var backgroundStyle: BackgroundStyles = .light\n    \n    // Dismiss\n    public var dismissTimeInterval: Double? = nil // 'nil' for default setting.\n    \n    public init() {}\n}\n"
  },
  {
    "path": "GCProgressSample/GradientCircularProgress/Styles/OrangeClearStyle.swift",
    "content": "//\n//  OrangeClearStyle.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/11/24.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\nimport UIKit\n\npublic struct OrangeClearStyle: StyleProperty {\n    // Progress Size\n    public var progressSize: CGFloat = 80\n    \n    // Gradient Circular\n    public var arcLineWidth: CGFloat = 6.0\n    public var startArcColor: UIColor = UIColor.clear\n    public var endArcColor: UIColor = UIColor.orange\n    \n    // Base Circular\n    public var baseLineWidth: CGFloat? = nil\n    public var baseArcColor: UIColor? = nil\n    \n    // Ratio\n    public var ratioLabelFont: UIFont? = UIFont.systemFont(ofSize: 13.0)\n    public var ratioLabelFontColor: UIColor? = UIColor.black\n    \n    // Message\n    public var messageLabelFont: UIFont? = nil\n    public var messageLabelFontColor: UIColor? = nil\n    \n    // Background\n    public var backgroundStyle: BackgroundStyles = .none\n    \n    // Dismiss\n    public var dismissTimeInterval: Double? = nil // 'nil' for default setting.\n    \n    public init() {}\n}\n"
  },
  {
    "path": "GCProgressSample/GradientCircularProgress/Styles/Style.swift",
    "content": "//\n//  DefaultStyle.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/08/31.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\nimport UIKit\n\npublic struct Style: StyleProperty {\n    // Progress Size\n    public var progressSize: CGFloat = 220\n    \n    // Gradient Circular\n    public var arcLineWidth: CGFloat = 16.0\n    public var startArcColor: UIColor = ColorUtil.toUIColor(r: 230.0, g: 230.0, b: 230.0, a: 0.6)\n    public var endArcColor: UIColor = ColorUtil.toUIColor(r: 90.0, g: 90.0, b: 90.0, a: 1.0)\n    \n    // Base Circular\n    public var baseLineWidth: CGFloat? = 16.0\n    public var baseArcColor: UIColor? = UIColor(red:1.0, green: 1.0, blue: 1.0, alpha: 0.8)\n    \n    // Ratio\n    public var ratioLabelFont: UIFont? = UIFont.systemFont(ofSize: 18.0)\n    public var ratioLabelFontColor: UIColor? = UIColor.black\n    \n    // Message\n    public var messageLabelFont: UIFont? = UIFont.systemFont(ofSize: 18.0)\n    public var messageLabelFontColor: UIColor? = UIColor.black\n    \n    // Background\n    public var backgroundStyle: BackgroundStyles = .extraLight\n    \n    // Dismiss\n    public var dismissTimeInterval: Double? = nil // 'nil' for default setting.\n    \n    public init() {}\n}\n"
  },
  {
    "path": "GCProgressSample/GradientCircularProgress/Utils/ColorUtil.swift",
    "content": "//\n//  ColorUtil.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/11/23.\n//  Copyright © 2015年 keygx. All rights reserved.\n//\n\nimport UIKit\n\npublic class ColorUtil {\n    \n    public class func toUIColor(r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat) -> UIColor {\n        \n        return UIColor(red: r/255.0, green: g/255.0, blue: b/255.0, alpha: a)\n    }\n    \n    internal class func toRGBA(color: UIColor) -> (r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat) {\n        var r: CGFloat = 0.0\n        var g: CGFloat = 0.0\n        var b: CGFloat = 0.0\n        var a: CGFloat = 0.0\n        \n        color.getRed(&r, green: &g, blue: &b, alpha: &a)\n        \n        return (r, g, b, a)\n    }\n    \n    internal class func toNotOpacityColor(color: UIColor) -> UIColor {\n        \n        if color == UIColor.clear {\n            return UIColor.white\n        } else {\n            return UIColor(\n                red: ColorUtil.toRGBA(color: color).r,\n                green: ColorUtil.toRGBA(color: color).g,\n                blue: ColorUtil.toRGBA(color: color).b,\n                alpha: 1.0)\n        }\n    }\n}\n"
  },
  {
    "path": "GradientCircularProgress.podspec",
    "content": "Pod::Spec.new do |s|\n  s.name = \"GradientCircularProgress\"\n  s.version = \"3.13.0\"\n  s.summary = \"Customizable progress indicator library in Swift\"\n  s.homepage = \"https://github.com/keygx/GradientCircularProgress\"\n  s.license = { :type => \"MIT\", :file => \"LICENSE\" }\n  s.author = { \"keygx\" => \"y.kagiyama@gmail.com\" }\n  s.social_media_url = \"http://twitter.com/keygx\"\n  s.platform = :ios\n  s.ios.deployment_target = '8.0'\n  s.source = { :git => \"https://github.com/keygx/GradientCircularProgress.git\", :tag => \"#{s.version}\" }\n  s.source_files = \"source/**/*\"\n  s.requires_arc = true\nend\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Yukihiko Kagiyama\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE."
  },
  {
    "path": "README.md",
    "content": "# Gradient Circular Progress\n\nCustomizable progress indicator library in Swift\n\n## Requirements\n- Swift 5.1\n- iOS 8.0 or later\n\n## Screen Shots\n\n- Preset style: [BlueDarkStyle.swift](https://github.com/keygx/GradientCircularProgress/blob/master/Source/BlueDarkStyle.swift)\n\n![](images/scr_BlueDarkStyle_01.png)  ![](images/scr_BlueDarkStyle_02.png)\n\n- All preset styles\n\n![](images/styles_01.png) \n![](images/styles_02.png) \n\n- Example Use AddSubView\n\n![](images/scr_AddSubViewEx_01.png)  ![](images/scr_AddSubViewEx_02.png)\n\n## Installation\n\n### Carthage\n\n```Cartfile\ngithub \"keygx/GradientCircularProgress\"\n```\n\n### CocoaPods\n\n```PodFile\npod 'GradientCircularProgress', :git => 'https://github.com/keygx/GradientCircularProgress'\n```\n\n### Swift versions support\n\n- Swift 5.1, tag \"swift5.1\"\n- Swift 5, tag \"swift5\"\n- Swift 4.2, tag \"swift4.2\"\n- Swift 4.1, tag \"swift4.1\"\n- Swift 4.0, tag \"swift4.0\"\n\n\n## Style Settings\n\nPlease make your original styles\n\n![](images/properties.png)\n\n- Define custom style structs that implements the StyleProperty Protocol\n\n[MyStyle.swift](https://github.com/keygx/GradientCircularProgress/blob/master/Sample/MyStyle.swift)\n\n```swift\nimport GradientCircularProgress\n\npublic struct MyStyle : StyleProperty {\n    /*** style properties **********************************************************************************/\n    \n    // Progress Size\n    public var progressSize: CGFloat = 200\n    \n    // Gradient Circular\n    public var arcLineWidth: CGFloat = 18.0\n    public var startArcColor: UIColor = UIColor.clear()\n    public var endArcColor: UIColor = UIColor.orange()\n    \n    // Base Circular\n    public var baseLineWidth: CGFloat? = 19.0\n    public var baseArcColor: UIColor? = UIColor.darkGray()\n    \n    // Ratio\n    public var ratioLabelFont: UIFont? = UIFont(name: \"Verdana-Bold\", size: 16.0)\n    public var ratioLabelFontColor: UIColor? = UIColor.white()\n    \n    // Message\n    public var messageLabelFont: UIFont? = UIFont.systemFont(ofSize: 16.0)\n    public var messageLabelFontColor: UIColor? = UIColor.white()\n    \n    // Background\n    public var backgroundStyle: BackgroundStyles = .dark\n    \n    // Dismiss\n    public var dismissTimeInterval: Double? = 0.0 // 'nil' for default setting.\n    \n    /*** style properties **********************************************************************************/\n    \n    public init() {}\n}\n\n```\n\n![](images/scr_MyStyle.png)\n\n## Usage\n```swift\nimport GradientCircularProgress\n```\n### Basic\n#### UIWindow\n```swift\nlet progress = GradientCircularProgress()\n\nprogress.show(message: \"Loading...\", MyStyle())\n\nprogress.dismiss()\n```\n#### addSubView\n```swift\nlet progress = GradientCircularProgress()\n\nlet progressView = progress.show(frame: rect, message: \"Loading...\", style: MyStyle())\nview.addSubview(progressView!)\n\nprogress.dismiss(progress: progressView!)\n```\n\n### at Rtio\n#### UIWindow\n```swift\nlet progress = GradientCircularProgress()\n\nlet ratio: CGFloat = CGFloat(totalBytesWritten) / CGFloat(totalBytesExpectedToWrite)        \nprogress.showAtRatio(style: MyStyle())\n\nprogress.updateRatio(ratio)\n\nprogress.dismiss()\n```\n#### addSubView\n```swift\nlet progress = GradientCircularProgress()\n\nlet progressView = progress.showAtRatio(frame: rect, display: true, style: MyStyle())\nview.addSubview(progressView!)\n\nprogress.updateRatio(ratio)\n\nprogress.dismiss(progress: progressView!)\n```\n\n### Update Message\n#### UIWindow\n```swift\nlet progress = GradientCircularProgress()\n\nprogress.show(message: \"Download\\n0 / 4\", MyStyle())\n\nprogress.updateMessage(message: \"Download\\n1 / 4\")\nprogress.updateMessage(message: \"Download\\n2 / 4\")\nprogress.updateMessage(message: \"Download\\n3 / 4\")\nprogress.updateMessage(message: \"Download\\n4 / 4\")\nprogress.updateMessage(message: \"Completed!\")\n\nprogress.dismiss()\n```\n#### addSubView\n```swift\nlet progress = GradientCircularProgress()\n\nlet progressView = progress.show(frame: rect, message: \"Download\\n0 / 4\", style: MyStyle())\nview.addSubview(progressView!)\n\nprogress.updateMessage(message: \"Download\\n1 / 4\")\nprogress.updateMessage(message: \"Download\\n2 / 4\")\nprogress.updateMessage(message: \"Download\\n3 / 4\")\nprogress.updateMessage(message: \"Download\\n4 / 4\")\nprogress.updateMessage(message: \"Completed!\")\n\nprogress.dismiss(progress: progressView!)\n```\n\n## API\n### Use UIWindow\n```swift\npublic func showAtRatio(display: Bool = true, style: StyleProperty = Style())\n\npublic func show(style: StyleProperty = Style())\n\npublic func show(message: String, style: StyleProperty = Style())\n\npublic func dismiss()\n\npublic func dismiss(_ completionHandler: () -> Void) -> ()\n```\n\n### Use addSubView\n```swift\npublic func showAtRatio(frame: CGRect, display: Bool = true, style: StyleProperty = Style()) -> UIView?\n\npublic func show(frame: CGRect, style: StyleProperty = Style()) -> UIView?\n\npublic func show(frame: CGRect, message: String, style: StyleProperty = Style()) -> UIView?\n\npublic func dismiss(progress view: UIView)\n\npublic func dismiss(progress view: UIView, completionHandler: () -> Void) -> ()\n```\n\n### Common\n```swift\npublic func updateMessage(message message: String)\n\npublic func updateRatio(_ ratio: CGFloat)\n```\n\n## License\n\nGradient Circular Progress is released under the MIT license. See LICENSE for details.\n\n## Author\n\nYukihiko Kagiyama (keygx) <https://twitter.com/keygx>\n\n"
  },
  {
    "path": "Sample/BackgroundTransparentStyle.swift",
    "content": "//\n//  BackgroundTransparentStyle.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2016/12/03.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\nimport UIKit\nimport GradientCircularProgress\n\npublic struct BackgroundTransparentStyle: StyleProperty {\n    /*** style properties **********************************************************************************/\n    \n    // Progress Size\n    public var progressSize: CGFloat = 200\n    \n    // Gradient Circular\n    public var arcLineWidth: CGFloat = 4.0\n    public var startArcColor: UIColor = ColorUtil.toUIColor(r: 0.0, g: 122.0, b: 255.0, a: 1.0)\n    public var endArcColor: UIColor = UIColor.cyan\n    \n    // Base Circular\n    public var baseLineWidth: CGFloat? = 6.0\n    public var baseArcColor: UIColor? = UIColor(red:0.0, green: 0.0, blue: 0.0, alpha: 0.2)\n    \n    // Ratio\n    public var ratioLabelFont: UIFont? = UIFont.systemFont(ofSize: 16.0)\n    public var ratioLabelFontColor: UIColor? = UIColor.black\n    \n    // Message\n    public var messageLabelFont: UIFont? = UIFont.systemFont(ofSize: 16.0)\n    public var messageLabelFontColor: UIColor? = UIColor.black\n    \n    // Background\n    public var backgroundStyle: BackgroundStyles = .transparent\n    \n    // Dismiss\n    public var dismissTimeInterval: Double? = nil // 'nil' for default setting.\n    \n    /*** style properties **********************************************************************************/\n    \n    public init() {}\n}\n"
  },
  {
    "path": "Sample/MyStyle.swift",
    "content": "//\n//  MyStyle.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/11/25.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\nimport UIKit\nimport GradientCircularProgress\n\npublic struct MyStyle: StyleProperty {\n    /*** style properties **********************************************************************************/\n    \n    // Progress Size\n    public var progressSize: CGFloat = 200\n    \n    // Gradient Circular\n    public var arcLineWidth: CGFloat = 18.0\n    public var startArcColor: UIColor = UIColor.clear\n    public var endArcColor: UIColor = UIColor.orange\n    \n    // Base Circular\n    public var baseLineWidth: CGFloat? = 19.0\n    public var baseArcColor: UIColor? = UIColor.darkGray\n    \n    // Ratio\n    public var ratioLabelFont: UIFont? = UIFont(name: \"Verdana-Bold\", size: 16.0)\n    public var ratioLabelFontColor: UIColor? = UIColor.white\n    \n    // Message\n    public var messageLabelFont: UIFont? = UIFont.systemFont(ofSize: 16.0)\n    public var messageLabelFontColor: UIColor? = UIColor.white\n    \n    // Background\n    public var backgroundStyle: BackgroundStyles = .dark\n    \n    // Dismiss\n    public var dismissTimeInterval: Double? = 0.0 // 'nil' for default setting.\n    \n    /*** style properties **********************************************************************************/\n    \n    public init() {}\n}\n"
  },
  {
    "path": "source/GradientCircularProgress.h",
    "content": "//\n//  GradientCircularProgress.h\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/06/24.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n//! Project version number for GradientCircularProgress.\nFOUNDATION_EXPORT double GradientCircularProgressVersionNumber;\n\n//! Project version string for GradientCircularProgress.\nFOUNDATION_EXPORT const unsigned char GradientCircularProgressVersionString[];\n\n// In this header, you should import all the public headers of your framework using statements like #import <GradientCircularProgress/PublicHeader.h>\n\n\n"
  },
  {
    "path": "source/GradientCircularProgress.swift",
    "content": "//\n//  GradientCircularProgress.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/07/29.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\n\nimport UIKit\n\npublic class GradientCircularProgress {\n    \n    private var baseWindow: UIWindow?\n    private var progressViewController: ProgressViewController?\n    private var progressView: ProgressView?\n    private var property: Property?\n    \n    public var isAvailable: Bool = false\n    \n    public init() {}\n}\n\n// MARK: Common\nextension GradientCircularProgress {\n    \n    public func updateMessage(message: String) {\n        if !isAvailable {\n            return\n        }\n        \n        // Use addSubView\n        if let v = progressView {\n            v.updateMessage(message)\n        }\n        \n        // Use UIWindow\n        if let vc = progressViewController {\n            vc.updateMessage(message: message)\n        }\n    }\n    \n    public func updateRatio(_ ratio: CGFloat) {\n        if !isAvailable {\n            return\n        }\n        \n        // Use addSubView\n        if let v = progressView {\n            v.ratio = ratio\n        }\n        \n        // Use UIWindow\n        if let vc = progressViewController {\n            vc.ratio = ratio\n        }\n    }\n}\n\n// MARK: Use UIWindow\nextension GradientCircularProgress {\n    \n    public func showAtRatio(display: Bool = true, style: StyleProperty = Style()) {\n        if isAvailable {\n            return\n        }\n        isAvailable = true\n        property = Property(style: style)\n        \n        getProgressAtRatio(display: display, style: style)\n    }\n    \n    private func getProgressAtRatio(display: Bool, style: StyleProperty) {\n        baseWindow = WindowBuilder.build()\n        progressViewController = ProgressViewController()\n        \n        guard let win = baseWindow, let vc = progressViewController else {\n            return\n        }\n        \n        win.rootViewController = vc\n        win.backgroundColor = UIColor.clear\n        vc.arc(display: display, style: style, baseWindow: baseWindow)\n    }\n    \n    public func show(style: StyleProperty = Style()) {\n        if isAvailable {\n            return\n        }\n        isAvailable = true\n        property = Property(style: style)\n        \n        getProgress(message: nil, style: style)\n    }\n    \n    public func show(message: String, style: StyleProperty = Style()) {\n        if isAvailable {\n            return\n        }\n        isAvailable = true\n        property = Property(style: style)\n        \n        getProgress(message: message, style: style)\n    }\n    \n    private func getProgress(message: String?, style: StyleProperty) {\n        baseWindow = WindowBuilder.build()\n        progressViewController = ProgressViewController()\n        \n        guard let win = baseWindow, let vc = progressViewController else {\n            return\n        }\n        \n        win.rootViewController = vc\n        win.backgroundColor = UIColor.clear\n        vc.circle(message: message, style: style, baseWindow: baseWindow)\n    }\n    \n    public func dismiss() {\n        if !isAvailable {\n            return\n        }\n        \n        guard let prop = property else {\n            return\n        }\n        \n        if let vc = progressViewController {\n            vc.dismiss(prop.dismissTimeInterval!)\n        }\n        \n        cleanup(prop.dismissTimeInterval!, completionHandler: nil)\n        \n    }\n    \n    public func dismiss(_ completionHandler: @escaping () -> Void) -> () {\n        if !isAvailable {\n            return\n        }\n        \n        guard let prop = property else {\n            return\n        }\n        \n        if let vc = progressViewController {\n            vc.dismiss(prop.dismissTimeInterval!)\n        }\n        \n        cleanup(prop.dismissTimeInterval!) {\n            completionHandler()\n        }\n    }\n    \n    private func cleanup(_ t: Double, completionHandler: (() -> Void)?) {\n        let delay = t * Double(NSEC_PER_SEC)\n        let time  = DispatchTime.now() + Double(Int64(delay)) / Double(NSEC_PER_SEC)\n        \n        DispatchQueue.main.asyncAfter(deadline: time) { [weak self] in\n            guard let win = self?.baseWindow else {\n                return\n            }\n            \n            UIView.animate(\n                withDuration: 0.3,\n                animations: {\n                    win.alpha = 0\n                },\n                completion: { finished in\n                    self?.progressViewController = nil\n                    win.isHidden = true\n                    win.rootViewController = nil\n                    self?.baseWindow = nil\n                    self?.property = nil\n                    self?.isAvailable = false\n                    guard let completionHandler = completionHandler else {\n                        return\n                    }\n                    completionHandler()\n                }\n            )\n        }\n    }\n}\n\n// MARK: Use addSubView\nextension GradientCircularProgress {\n    \n    public func showAtRatio(frame: CGRect, display: Bool = true, style: StyleProperty = Style()) -> UIView? {\n        if isAvailable {\n            return nil\n        }\n        isAvailable = true\n        property = Property(style: style)\n        \n        progressView = ProgressView(frame: frame)\n        \n        guard let v = progressView else {\n            return nil\n        }\n        \n        v.arc(display, style: style)\n        \n        return v\n    }\n    \n    public func show(frame: CGRect, style: StyleProperty = Style()) -> UIView? {\n        if isAvailable {\n            return nil\n        }\n        isAvailable = true\n        property = Property(style: style)\n        \n        return getProgress(frame: frame, message: nil, style: style)\n    }\n    \n    public func show(frame: CGRect, message: String, style: StyleProperty = Style()) -> UIView? {\n        if isAvailable {\n            return nil\n        }\n        isAvailable = true\n        property = Property(style: style)\n        \n        return getProgress(frame: frame, message: message, style: style)\n    }\n    \n    private func getProgress(frame: CGRect, message: String?, style: StyleProperty) -> UIView? {\n        \n        progressView = ProgressView(frame: frame)\n        \n        guard let v = progressView else {\n            return nil\n        }\n        \n        v.circle(message, style: style)\n        \n        return v\n    }\n    \n    public func dismiss(progress view: UIView) {\n        if !isAvailable {\n            return\n        }\n        \n        guard let prop = property else {\n            return\n        }\n        \n        cleanup(prop.dismissTimeInterval!, view: view, completionHandler: nil)\n    }\n    \n    public func dismiss(progress view: UIView, completionHandler: @escaping () -> Void) -> () {\n        if !isAvailable {\n            return\n        }\n        \n        guard let prop = property else {\n            return\n        }\n        \n        cleanup(prop.dismissTimeInterval!, view: view) {\n            completionHandler()\n        }\n    }\n    \n    private func cleanup(_ t: Double, view: UIView, completionHandler: (() -> Void)?) {\n        let delay = t * Double(NSEC_PER_SEC)\n        let time  = DispatchTime.now() + Double(Int64(delay)) / Double(NSEC_PER_SEC)\n        \n        DispatchQueue.main.asyncAfter(deadline: time) {\n            UIView.animate(\n                withDuration: 0.3,\n                animations: {\n                    view.alpha = 0\n                },\n                completion: { [weak self] finished in\n                    view.removeFromSuperview()\n                    self?.property = nil\n                    self?.isAvailable = false\n                    guard let completionHandler = completionHandler else {\n                        return\n                    }\n                    completionHandler()\n                }\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "source/Progress/Core/CircularProgressView.swift",
    "content": "//\n//  CircularProgressView.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/06/24.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\n\nimport UIKit\n\nclass CircularProgressView: UIView {\n    \n    var prop: Property?\n    var messageLabel = UILabel()\n    var centerPoint: CGPoint?\n    \n    var message: String? {\n        willSet {\n            messageLabel.frame = frame\n            messageLabel.text = newValue\n            \n            guard let message = messageLabel.text else {\n                return\n            }\n            \n            // Attribute\n            let paragraphStyle = NSMutableParagraphStyle()\n            paragraphStyle.lineHeightMultiple = 1.2\n            paragraphStyle.alignment = NSTextAlignment.center\n            let attr = [NSAttributedString.Key.paragraphStyle: paragraphStyle]\n            let attributedString = NSMutableAttributedString(string: message, attributes: attr)\n            \n            messageLabel.attributedText = attributedString\n            messageLabel.sizeToFit()\n            \n            if centerPoint == nil {\n                centerPoint = center\n            }\n            \n            if let center = centerPoint {\n                messageLabel.center = center\n            }\n        }\n    }\n    \n    var gradientLayer = CALayer()\n    \n    private struct Animation {\n        var rotationZ: CABasicAnimation {\n            let animation: CABasicAnimation = CABasicAnimation(keyPath: \"transform.rotation.z\")\n            animation.duration = 0.8\n            animation.repeatCount = HUGE\n            animation.fromValue = NSNumber(value: 0.0)\n            animation.toValue = NSNumber(value: 2 * Float.pi)\n            \n            return animation\n        }\n        \n        init() {}\n        \n        func start(_ layer: CALayer) {\n            layer.add(rotationZ, forKey: \"rotate\")\n        }\n        \n        func stop(_ layer: CALayer) {\n            layer.removeAllAnimations()\n        }\n    }\n    \n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        \n        backgroundColor = UIColor.clear\n        layer.masksToBounds = true\n        \n        NotificationCenter.default.addObserver(self,\n                                               selector: #selector(viewDidEnterBackground(_:)),\n                                               name: UIApplication.didEnterBackgroundNotification,\n                                               object: nil)\n        NotificationCenter.default.addObserver(self,\n                                               selector: #selector(viewWillEnterForeground(_:)),\n                                               name: UIApplication.willEnterForegroundNotification,\n                                               object: nil)\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    deinit {\n        NotificationCenter.default.removeObserver(self)\n    }\n    \n    override func didMoveToWindow() {\n        super.didMoveToWindow()\n        if window != nil {\n            Animation().start(gradientLayer)\n        } else {\n            Animation().stop(gradientLayer)\n        }\n    }\n    \n    @objc private func viewDidEnterBackground(_ notification: Notification?) {\n        Animation().stop(gradientLayer)\n    }\n    \n    @objc private func viewWillEnterForeground(_ notification: Notification?) {\n        Animation().start(gradientLayer)\n    }\n    \n    internal func initialize(frame: CGRect) {\n        \n        guard let prop = prop else {\n            return\n        }\n        \n        let rect: CGRect = CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height)\n        \n        // Base Circular\n        if let baseLineWidth = prop.baseLineWidth, let baseArcColor = prop.baseArcColor {\n            let circular: ArcView = ArcView(frame: rect, lineWidth: baseLineWidth)\n            circular.color = baseArcColor\n            circular.prop = prop\n            addSubview(circular)\n        }\n        \n        // Gradient Circular\n        if ColorUtil.toRGBA(color: prop.startArcColor).a < 1.0 || ColorUtil.toRGBA(color: prop.endArcColor).a < 1.0 {\n            // Clear Color\n            let gradient: UIView = GradientArcWithClearColorView().draw(rect: rect, prop: prop)\n            addSubview(gradient)\n            \n            gradientLayer = gradient.layer\n            Animation().start(gradientLayer)\n            \n        } else {\n            // Opaque Color\n            let gradient: GradientArcView = GradientArcView(frame: rect)\n            gradient.prop = prop\n            addSubview(gradient)\n            \n            gradientLayer = gradient.layer\n            Animation().start(gradientLayer)\n        }\n    }\n    \n    internal func showMessage(_ message: String) {\n        \n        guard let prop = prop else {\n            return\n        }\n        \n        // Message\n        messageLabel.font = prop.messageLabelFont\n        messageLabel.textAlignment = NSTextAlignment.center\n        messageLabel.textColor = prop.messageLabelFontColor\n        messageLabel.numberOfLines = 0\n\n        addSubview(messageLabel)\n        \n        self.message = message\n    }\n}\n"
  },
  {
    "path": "source/Progress/Core/ProgressAtRatioView.swift",
    "content": "//\n//  ProgressAtRatioView.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/06/24.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\n\nimport UIKit\n\nclass ProgressAtRatioView: UIView {\n    \n    internal var arcView: ArcView?\n    internal var prop: Property?\n    internal var ratioLabel: UILabel = UILabel()\n    \n    internal var ratio: CGFloat = 0.0 {\n        didSet {\n            ratioLabel.text = String(format:\"%.0f\", ratio * 100) + \"%\"\n        }\n    }\n    \n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        \n        backgroundColor = UIColor.clear\n        layer.masksToBounds = true\n    }\n\n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    internal func initialize(frame: CGRect) {\n        \n        guard let prop = prop else {\n            return\n        }\n        \n        let rect: CGRect = CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height)\n        \n        // Base Circular\n        if let baseLineWidth = prop.baseLineWidth, let baseArcColor = prop.baseArcColor {\n            let circular: ArcView = ArcView(frame: rect, lineWidth: baseLineWidth)\n            circular.prop = prop\n            circular.ratio = 1.0\n            circular.color = baseArcColor\n            circular.lineWidth = baseLineWidth\n            addSubview(circular)\n        }\n        \n        // Gradient Circular\n        if ColorUtil.toRGBA(color: prop.startArcColor).a < 1.0 || ColorUtil.toRGBA(color: prop.endArcColor).a < 1.0 {\n            // Clear Color\n            let gradient: UIView = GradientArcWithClearColorView().draw(rect: rect, prop: prop)\n            addSubview(gradient)\n            \n            masking(rect: rect, prop: prop, gradient: gradient)\n            \n        } else {\n            // Opaque Color\n            let gradient: GradientArcView = GradientArcView(frame: rect)\n            gradient.prop = prop\n            addSubview(gradient)\n            \n            masking(rect: rect, prop: prop, gradient: gradient)\n        }\n    }\n    \n    private func masking(rect: CGRect, prop: Property, gradient: UIView) {\n        // Mask\n        arcView = ArcView(frame: rect, lineWidth: prop.arcLineWidth)\n        \n        guard let mask = arcView else {\n            return\n        }\n        \n        mask.prop = prop\n        gradient.layer.mask = mask.layer\n    }\n    \n    override func draw(_ rect: CGRect) {\n        \n        guard let mask = arcView else {\n            return\n        }\n        \n        if ratio > 1.0 {\n            mask.ratio = 1.0\n        } else {\n            mask.ratio = ratio\n        }\n        mask.setNeedsDisplay()\n    }\n    \n    func showRatio() {\n        \n        guard let prop = prop else {\n            return\n        }\n        \n        // Progress Ratio\n        ratioLabel.text = \"          \"\n        ratioLabel.font = prop.ratioLabelFont\n        ratioLabel.textAlignment = NSTextAlignment.right\n        ratioLabel.textColor = prop.ratioLabelFontColor\n        ratioLabel.sizeToFit()\n        ratioLabel.center = center\n        \n        addSubview(ratioLabel)\n    }\n}\n"
  },
  {
    "path": "source/Progress/Elements/ArcView.swift",
    "content": "//\n//  Arc.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/06/24.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\n\nimport UIKit\n\nclass ArcView: UIView {\n    \n    var prop: Property?\n    var ratio: CGFloat = 1.0\n    var color: UIColor = UIColor.black\n    var lineWidth: CGFloat = 0.0\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    init(frame: CGRect, lineWidth: CGFloat) {\n        super.init(frame: frame)\n        \n        backgroundColor = UIColor.clear\n        layer.masksToBounds = true\n        \n        self.lineWidth = lineWidth\n    }\n    \n    override func draw(_ rect: CGRect) {\n        \n        drawArc(rect: rect)\n    }\n    \n    private func drawArc(rect: CGRect) {\n        \n        guard let prop = prop else {\n            return\n        }\n        \n        let circularRect: CGRect = prop.progressRect\n        \n        let arcPoint: CGPoint      = CGPoint(x: rect.width/2, y: rect.height/2)\n        let arcRadius: CGFloat     = circularRect.width/2 + prop.arcLineWidth/2\n        let arcStartAngle: CGFloat = -CGFloat.pi/2\n        let arcEndAngle: CGFloat   = ratio * 2.0 * CGFloat.pi - CGFloat.pi/2\n        \n        let arc: UIBezierPath = UIBezierPath(arcCenter: arcPoint,\n                                             radius: arcRadius,\n                                             startAngle: arcStartAngle,\n                                             endAngle: arcEndAngle,\n                                             clockwise: true)\n        \n        color.setStroke()\n        \n        arc.lineWidth = lineWidth\n        arc.lineCapStyle = prop.arcLineCapStyle\n        arc.stroke()\n    }\n}\n"
  },
  {
    "path": "source/Progress/Elements/Background.swift",
    "content": "//\n//  Background.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/06/24.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\n\n\nstruct Background {\n    \n    internal func blurEffectView(fromBlurStyle style: BackgroundStyles, frame: CGRect) -> UIVisualEffectView? {\n        \n        var blurView: UIVisualEffectView?\n        \n        // return (blurEffectStyle: UIBlurEffectStyle?, isUserInteraction: Bool)\n        let backgroundStyle = getStyle(style)\n        \n        if let blur = backgroundStyle.blurEffectStyle {\n            // UIBlurEffectStyle (.extraLight, .light, .dark)\n            let effect = UIBlurEffect(style: blur)\n            blurView = UIVisualEffectView(effect: effect)\n        \n        } else {\n            if !backgroundStyle.isUserInteraction {\n                // .transparent\n                blurView = UIVisualEffectView(effect: nil)\n            }\n        }\n        \n        blurView?.frame = frame\n        return blurView\n    }\n    \n    private func getStyle(_ style: BackgroundStyles) -> (blurEffectStyle: UIBlurEffect.Style?, isUserInteraction: Bool) {\n        switch style {\n        case .extraLight:\n            return (.extraLight, false)\n        case .light:\n            return (.light, false)\n        case .dark:\n            return (.dark, false)\n        case .transparent:\n            return (nil, false)\n        default:\n            // .none\n            return (nil, true)\n        }\n    }\n}\n"
  },
  {
    "path": "source/Progress/Elements/GradientArcView.swift",
    "content": "//\n//  GradientArcView.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/06/24.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\n\nimport UIKit\n\nclass GradientArcView: UIView {\n    \n    internal var prop: Property?\n    \n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        \n        backgroundColor = UIColor.clear\n        layer.masksToBounds = true\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    private func getGradientPointColor(ratio: CGFloat, startColor: UIColor, endColor: UIColor) -> UIColor {\n        \n        let sColor = ColorUtil.toRGBA(color: startColor)\n        let eColor = ColorUtil.toRGBA(color: endColor)\n        \n        let r = (eColor.r - sColor.r) * ratio + sColor.r\n        let g = (eColor.g - sColor.g) * ratio + sColor.g\n        let b = (eColor.b - sColor.b) * ratio + sColor.b\n        let a = (eColor.a - sColor.a) * ratio + sColor.a\n        \n        return UIColor(red: r, green: g, blue: b, alpha: a)\n    }\n    \n    override func draw(_ rect: CGRect) {\n        \n        guard let prop = prop else {\n            return\n        }\n        \n        let circularRect: CGRect = prop.progressRect\n        \n        var currentAngle: CGFloat = 0.0\n        \n        for i in stride(from:CGFloat(0.0), through: CGFloat(1.0), by: CGFloat(0.005)) {\n            \n            let arcPoint: CGPoint = CGPoint(x: rect.width/2, y: rect.height/2)\n            let arcRadius: CGFloat = circularRect.width/2 + prop.arcLineWidth/2\n            let arcStartAngle: CGFloat = -CGFloat.pi/2\n            let arcEndAngle: CGFloat = i * 2.0 * CGFloat.pi - CGFloat.pi/2\n            \n            if currentAngle == 0.0 {\n                currentAngle = arcStartAngle\n            } else {\n                currentAngle = arcEndAngle - 0.05\n            }\n            \n            let arc: UIBezierPath = UIBezierPath(arcCenter: arcPoint,\n                                                 radius: arcRadius,\n                                                 startAngle: currentAngle,\n                                                 endAngle: arcEndAngle,\n                                                 clockwise: true)\n            \n            let strokeColor: UIColor = getGradientPointColor(ratio: i, startColor: prop.startArcColor, endColor: prop.endArcColor)\n            strokeColor.setStroke()\n            \n            arc.lineWidth = prop.arcLineWidth\n            arc.lineCapStyle = prop.arcLineCapStyle\n            arc.stroke()\n        }\n    }\n}\n"
  },
  {
    "path": "source/Progress/Elements/GradientArcWithClearColorView.swift",
    "content": "//\n//  GradientArcWithClearColorView.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/11/20.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\n\nimport UIKit\n\nclass GradientArcWithClearColorView: UIView {\n    \n    internal func draw(rect: CGRect, prop: Property) -> UIImageView {\n        // Gradient Clear Circular\n        \n        /* Prop */\n        var startArcColorProp = prop\n        var endArcColorProp = prop\n        var startGradientMaskProp = prop\n        var endGradientMaskProp = prop\n        var solidMaskProp = prop\n        \n        // StartArc\n        startArcColorProp.endArcColor = ColorUtil.toNotOpacityColor(color: startArcColorProp.startArcColor)\n        \n        // EndArc\n        endArcColorProp.startArcColor = ColorUtil.toNotOpacityColor(color: endArcColorProp.endArcColor)\n        \n        // StartGradientMask\n        startGradientMaskProp.startArcColor = UIColor.black\n        startGradientMaskProp.endArcColor = UIColor.white\n        startGradientMaskProp.progressSize += 10.0\n        startGradientMaskProp.arcLineWidth += 20.0\n        \n        // EndGradientMask\n        endGradientMaskProp.startArcColor = UIColor.white\n        endGradientMaskProp.endArcColor = UIColor.black\n        endGradientMaskProp.progressSize += 10.0\n        endGradientMaskProp.arcLineWidth += 20.0\n\n        // SolidMask\n        solidMaskProp.startArcColor = UIColor.black\n        solidMaskProp.endArcColor   = UIColor.black\n        \n        /* Mask Image */\n        // StartArcColorImage\n        let startArcColorView = ArcView(frame: rect, lineWidth: startArcColorProp.arcLineWidth)\n        startArcColorView.color = startArcColorProp.startArcColor\n        startArcColorView.prop = startArcColorProp\n        let startArcColorImage = viewToUIImage(view: startArcColorView)!\n        \n        // StartGradientMaskImage\n        let startGradientMaskView = GradientArcView(frame: rect)\n        startGradientMaskView.prop = startGradientMaskProp\n        let startGradientMaskImage = viewToUIImage(view: startGradientMaskView)!\n        \n        // EndArcColorImage\n        let endArcColorView = ArcView(frame: rect, lineWidth: endArcColorProp.arcLineWidth)\n        endArcColorView.color = endArcColorProp.startArcColor\n        endArcColorView.prop = endArcColorProp\n        let endArcColorImage = viewToUIImage(view: endArcColorView)!\n        \n        // EndGradientMaskImage\n        let endGradientMaskView = GradientArcView(frame: rect)\n        endGradientMaskView.prop = endGradientMaskProp\n        let endGradientMaskImage = viewToUIImage(view: endGradientMaskView)!\n        \n        // SolidMaskImage\n        let solidMaskView = ArcView(frame: rect, lineWidth: solidMaskProp.arcLineWidth)\n        solidMaskView.prop = solidMaskProp\n        let solidMaskImage = viewToUIImage(view: solidMaskView)!\n        \n        /* Masking */\n        var startArcImage = mask(image: startGradientMaskImage, maskImage: solidMaskImage)\n        startArcImage = mask(image: startArcColorImage, maskImage: startArcImage)\n        \n        var endArcImage = mask(image: endGradientMaskImage, maskImage: solidMaskImage)\n        endArcImage = mask(image: endArcColorImage, maskImage: endArcImage)\n        \n        /* Composite */\n        let image: UIImage = composite(image1: startArcImage, image2: endArcImage, prop: prop)\n        \n        /* UIImageView */\n        let imageView = UIImageView(image: image)\n        imageView.contentMode = .scaleAspectFill\n        imageView.clipsToBounds = true\n        \n        return imageView\n    }\n    \n    internal func mask(image: UIImage, maskImage: UIImage) -> UIImage {\n        \n        let maskRef: CGImage = maskImage.cgImage!\n        let mask: CGImage = CGImage(\n            maskWidth: maskRef.width,\n            height: maskRef.height,\n            bitsPerComponent: maskRef.bitsPerComponent,\n            bitsPerPixel: maskRef.bitsPerPixel,\n            bytesPerRow: maskRef.bytesPerRow,\n            provider: maskRef.dataProvider!,\n            decode: nil,\n            shouldInterpolate: false)!\n        \n        let maskedImageRef: CGImage = image.cgImage!.masking(mask)!\n        let scale = UIScreen.main.scale\n        let maskedImage: UIImage = UIImage(cgImage: maskedImageRef, scale: scale, orientation: .up)\n        \n        return maskedImage\n    }\n    \n    internal func viewToUIImage(view: UIView) -> UIImage? {\n        \n        let scale = UIScreen.main.scale\n        UIGraphicsBeginImageContextWithOptions(view.frame.size, false, scale)\n        view.layer.render(in: UIGraphicsGetCurrentContext()!)\n        let image = UIGraphicsGetImageFromCurrentImageContext()\n        UIGraphicsEndImageContext()\n        \n        return image\n    }\n    \n    internal func composite(image1: UIImage, image2: UIImage, prop: Property) -> UIImage {\n        \n        let scale = UIScreen.main.scale\n        UIGraphicsBeginImageContextWithOptions(image1.size, false, scale)\n        image1.draw(\n            in: CGRect(x: 0, y: 0, width: image1.size.width, height: image1.size.height),\n            blendMode: .overlay,\n            alpha: ColorUtil.toRGBA(color: prop.startArcColor).a)\n        image2.draw(\n            in: CGRect(x: 0, y: 0, width: image2.size.width, height: image2.size.height),\n            blendMode: .overlay,\n            alpha: ColorUtil.toRGBA(color: prop.endArcColor).a)\n        let image = UIGraphicsGetImageFromCurrentImageContext()\n        UIGraphicsEndImageContext()\n        \n        return image!\n    }\n}\n"
  },
  {
    "path": "source/Progress/Elements/WindowBuilder.swift",
    "content": "//\n//  WindowBuilder.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2019/09/24.\n//  Copyright © 2019 keygx. All rights reserved.\n//\n\nimport UIKit\n\nclass WindowBuilder {\n    static func build() -> UIWindow? {\n        var baseWindow: UIWindow?\n        \n        if #available(iOS 13.0, *) {\n            let windowScene = UIApplication.shared.connectedScenes\n                                .filter { $0.activationState == .foregroundActive }.first\n            if let windowScene = windowScene as? UIWindowScene {\n                baseWindow = UIWindow(windowScene: windowScene)\n            } else {\n                baseWindow = UIWindow()\n            }\n        } else {\n            baseWindow = UIWindow()\n        }\n        \n        baseWindow?.bounds = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)\n        baseWindow?.backgroundColor = UIColor.clear\n        baseWindow?.windowLevel = UIWindow.Level.alert + 1\n        baseWindow?.makeKeyAndVisible()\n        \n        return baseWindow\n    }\n}\n"
  },
  {
    "path": "source/Progress/ProgressView.swift",
    "content": "//\n//  ProgressView.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2016/03/07.\n//  Copyright (c) 2016年 keygx. All rights reserved.\n//\n\nimport UIKit\n\nclass ProgressView: UIView {\n    \n    private var viewRect: CGRect?\n    private var blurView: UIVisualEffectView?\n    private var progressAtRatioView: ProgressAtRatioView?\n    private var circularProgressView: CircularProgressView?\n    internal var prop: Property?\n    \n    internal var ratio: CGFloat = 0.0 {\n        didSet {\n            progressAtRatioView?.ratio = ratio\n            progressAtRatioView?.setNeedsDisplay()\n        }\n    }\n    \n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        \n        initialize(frame: frame)\n    }\n    \n    required init(coder aDecoder: NSCoder) {\n        super.init(coder: aDecoder)!\n    }\n    \n    private func initialize(frame: CGRect) {\n        viewRect = CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height)\n        clipsToBounds = true\n    }\n    \n    internal func arc(_ display: Bool, style: StyleProperty) {\n        \n        prop = Property(style: style)\n        \n        guard let prop = prop else {\n            return\n        }\n        \n        isUserInteractionEnabled = !(prop.backgroundStyle.rawValue == 0) ? true : false\n        \n        getBlurView()\n        \n        progressAtRatioView = ProgressAtRatioView(frame: CGRect(x: 0, y: 0, width: prop.progressSize, height: prop.progressSize))\n        \n        guard let progressAtRatioView = progressAtRatioView else {\n            return\n        }\n        \n        progressAtRatioView.prop = prop\n        progressAtRatioView.initialize(frame: progressAtRatioView.frame)\n        \n        if display {\n            progressAtRatioView.showRatio()\n        }\n        \n        progressAtRatioView.frame = CGRect(\n            x: (frame.size.width - progressAtRatioView.frame.size.width) / 2,\n            y: (frame.size.height - progressAtRatioView.frame.size.height) / 2,\n            width: progressAtRatioView.frame.size.width,\n            height: progressAtRatioView.frame.size.height)\n        \n        addSubview(progressAtRatioView)\n    }\n    \n    internal func circle(_ message: String?, style: StyleProperty) {\n        \n        prop = Property(style: style)\n        \n        guard let prop = prop else {\n            return\n        }\n        \n        isUserInteractionEnabled = !(prop.backgroundStyle.rawValue == 0) ? true : false\n                \n        getBlurView()\n        \n        circularProgressView = CircularProgressView(frame: CGRect(x: 0, y: 0, width: prop.progressSize, height: prop.progressSize))\n        \n        guard let circularProgressView = circularProgressView else {\n            return\n        }\n        \n        circularProgressView.prop = prop\n        circularProgressView.initialize(frame: circularProgressView.frame)\n        \n        if let message = message {\n            circularProgressView.showMessage(message)\n        }\n        \n        circularProgressView.frame = CGRect(\n            x: (frame.size.width - circularProgressView.frame.size.width) / 2,\n            y: (frame.size.height - circularProgressView.frame.size.height) / 2,\n            width: circularProgressView.frame.size.width,\n            height: circularProgressView.frame.size.height)\n        \n        addSubview(circularProgressView)\n    }\n    \n    internal func updateMessage(_ message: String) {\n        \n        guard let circularProgressView = circularProgressView else {\n            return\n        }\n        \n        circularProgressView.message = message\n    }\n    \n    private func getBlurView() {\n        \n        guard let rect = viewRect, let prop = prop else {\n            return\n        }\n        \n        blurView = Background().blurEffectView(fromBlurStyle: prop.backgroundStyle, frame: rect)\n        \n        guard let blurView = blurView else {\n            return\n        }\n        \n        backgroundColor = UIColor.clear\n        addSubview(blurView)\n    }\n}\n"
  },
  {
    "path": "source/Progress/ProgressViewController.swift",
    "content": "//\n//  ProgressViewController.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/06/24.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\n\nimport UIKit\n\nclass ProgressViewController: UIViewController {\n    \n    private var viewRect: CGRect?\n    private var blurView: UIVisualEffectView?\n    private var progressAtRatioView: ProgressAtRatioView?\n    private var circularProgressView: CircularProgressView?\n    internal var prop: Property?\n    \n    internal var ratio: CGFloat = 0.0 {\n        didSet {\n            progressAtRatioView?.ratio = ratio\n            progressAtRatioView?.setNeedsDisplay()\n        }\n    }\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        view.backgroundColor = UIColor.clear\n    }\n    \n    override func didReceiveMemoryWarning() {\n        super.didReceiveMemoryWarning()\n    }\n    \n    override var shouldAutorotate: Bool {\n        return false\n    }\n    \n    override var prefersStatusBarHidden: Bool {\n        let orientation: UIInterfaceOrientation\n        if #available(iOS 13.0, *) {\n            orientation = UIApplication.shared.windows.first?.windowScene?.interfaceOrientation ?? .portrait\n        } else {\n            orientation = UIApplication.shared.statusBarOrientation\n        }\n        \n        switch orientation {\n        case .landscapeLeft, .landscapeRight:\n            // LandscapeLeft | LandscapeRight\n            return true\n        default:\n            // Unknown | Portrait | PortraitUpsideDown\n            return false\n        }\n    }\n    \n    private func getViewRect() {\n        \n        let window = UIWindow(frame: UIScreen.main.bounds)\n        \n        viewRect = window.frame\n    }\n    \n    private func getBlurView() {\n        \n        guard let rect = viewRect, let prop = prop else {\n            return\n        }\n        \n        blurView = Background().blurEffectView(fromBlurStyle: prop.backgroundStyle, frame: rect)\n        \n        guard let blurView = blurView else {\n            return\n        }\n        \n        view.backgroundColor = UIColor.clear\n        view.addSubview(blurView)\n    }\n    \n    internal func arc(display: Bool, style: StyleProperty, baseWindow: UIWindow?) {\n        \n        prop = Property(style: style)\n        \n        guard let win = baseWindow, let prop = prop else {\n            return\n        }\n        \n        win.isUserInteractionEnabled = !(prop.backgroundStyle.rawValue == 0) ? true : false // 0 == .None\n        \n        getViewRect()\n        \n        getBlurView()\n        \n        progressAtRatioView = ProgressAtRatioView(frame: CGRect(x: 0, y: 0, width: prop.progressSize, height: prop.progressSize))\n        \n        guard let progressAtRatioView = progressAtRatioView else {\n            return\n        }\n        \n        progressAtRatioView.prop = prop\n        progressAtRatioView.initialize(frame: progressAtRatioView.frame)\n        \n        if display {\n            progressAtRatioView.showRatio()\n        }\n        \n        progressAtRatioView.center = view.center\n        view.addSubview(progressAtRatioView)\n    }\n    \n    internal func circle(message: String?, style: StyleProperty, baseWindow: UIWindow?) {\n        \n        prop = Property(style: style)\n        \n        guard let win = baseWindow, let prop = prop else {\n            return\n        }\n        \n        win.isUserInteractionEnabled = !(prop.backgroundStyle.rawValue == 0) ? true : false // 0 == .None\n        \n        getViewRect()\n        \n        getBlurView()\n                \n        circularProgressView = CircularProgressView(frame: CGRect(x: 0, y: 0, width: prop.progressSize, height: prop.progressSize))\n        \n        guard let circularProgressView = circularProgressView else {\n            return\n        }\n        \n        circularProgressView.prop = prop\n        circularProgressView.initialize(frame: circularProgressView.frame)\n        \n        if message != nil {\n            circularProgressView.showMessage(message!)\n        }\n        \n        circularProgressView.center = view.center\n        view.addSubview(circularProgressView)\n    }\n    \n    internal func updateMessage(message: String) {\n        \n        guard let circularProgressView = circularProgressView else {\n            return\n        }\n        \n        circularProgressView.message = message\n    }\n  \n    internal func dismiss(_ t: Double) {\n        \n        let delay = t * Double(NSEC_PER_SEC)\n        let time  = DispatchTime.now() + Double(Int64(delay)) / Double(NSEC_PER_SEC)\n        \n        DispatchQueue.main.asyncAfter(deadline: time) {\n            guard let blurView = self.blurView, let progressAtRatioView = self.progressAtRatioView, let circularProgressView = self.circularProgressView else {\n                return\n            }\n            \n            UIView.animate(\n                withDuration: 0.3,\n                animations: {\n                    progressAtRatioView.alpha = 0.0\n                    circularProgressView.alpha = 0.0\n                },\n                completion: { finished in\n                    progressAtRatioView.removeFromSuperview()\n                    circularProgressView.removeFromSuperview()\n                    blurView.removeFromSuperview()\n                }\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "source/Progress/Property.swift",
    "content": "//\n//  Property.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/06/24.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\n\npublic protocol StyleProperty {\n    // Progress Size\n    var progressSize: CGFloat { get set }\n    \n    // Gradient Circular\n    var arcLineWidth: CGFloat { get set }\n    var startArcColor: UIColor { get set }\n    var endArcColor: UIColor { get set }\n    \n    // Base Circular\n    var baseLineWidth: CGFloat? { get set }\n    var baseArcColor: UIColor? { get set }\n    \n    // Ratio\n    var ratioLabelFont: UIFont? { get set }\n    var ratioLabelFontColor: UIColor? { get set }\n    \n    // Message\n    var messageLabelFont: UIFont? { get set }\n    var messageLabelFontColor: UIColor? { get set }\n    \n    // Background\n    var backgroundStyle: BackgroundStyles { get set }\n    \n    // Dismiss\n    var dismissTimeInterval: Double? { get set }\n    \n    // Initialize\n    init()\n}\n\npublic enum BackgroundStyles: Int {\n    case none = 0\n    case extraLight\n    case light\n    case dark\n    case transparent\n}\n\n\ninternal struct Property {\n    let margin: CGFloat = 5.0\n    let arcLineCapStyle: CGLineCap = CGLineCap.butt\n    \n    // Progress Size\n    var progressSize: CGFloat\n    \n    // Gradient Circular\n    var arcLineWidth: CGFloat\n    var startArcColor: UIColor\n    var endArcColor: UIColor\n    \n    // Base Circular\n    var baseLineWidth: CGFloat?\n    var baseArcColor: UIColor?\n    \n    // Ratio\n    let ratioLabelFont: UIFont?\n    let ratioLabelFontColor: UIColor?\n    \n    // Message\n    let messageLabelFont: UIFont?\n    let messageLabelFontColor: UIColor?\n    \n    // Background\n    let backgroundStyle: BackgroundStyles\n    \n    // Dismiss\n    let dismissTimeInterval: Double?\n    \n    // Progress Rect\n    var progressRect: CGRect {\n        let lineWidth: CGFloat = (arcLineWidth > baseLineWidth!) ? arcLineWidth : baseLineWidth!\n        return CGRect(x: 0, y: 0, width: progressSize - lineWidth * 2, height: progressSize - lineWidth * 2)\n    }\n    \n    init(style: StyleProperty) {\n        \n        let styles: StyleProperty = style\n        \n        progressSize          = styles.progressSize\n        arcLineWidth          = styles.arcLineWidth\n        startArcColor         = styles.startArcColor\n        endArcColor           = styles.endArcColor\n        baseLineWidth         = styles.baseLineWidth         ?? 0.0\n        baseArcColor          = styles.baseArcColor          ?? UIColor.clear\n        ratioLabelFont        = styles.ratioLabelFont        ?? UIFont.systemFont(ofSize: 16.0)\n        ratioLabelFontColor   = styles.ratioLabelFontColor   ?? UIColor.clear\n        messageLabelFont      = styles.messageLabelFont      ?? UIFont.systemFont(ofSize: 16.0)\n        messageLabelFontColor = styles.messageLabelFontColor ?? UIColor.clear\n        backgroundStyle       = styles.backgroundStyle\n        dismissTimeInterval   = styles.dismissTimeInterval    ?? 0.8\n    }\n}\n"
  },
  {
    "path": "source/Styles/BlueDarkStyle.swift",
    "content": "//\n//  BlueDarkStyle.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/08/31.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\nimport UIKit\n\npublic struct BlueDarkStyle: StyleProperty {\n    // Progress Size\n    public var progressSize: CGFloat = 260\n    \n    // Gradient Circular\n    public var arcLineWidth: CGFloat = 4.0\n    public var startArcColor: UIColor = ColorUtil.toUIColor(r: 0.0, g: 122.0, b: 255.0, a: 1.0)\n    public var endArcColor: UIColor = UIColor.cyan\n    \n    // Base Circular\n    public var baseLineWidth: CGFloat? = 5.0\n    public var baseArcColor: UIColor? = UIColor(red:0.0, green: 0.0, blue: 0.0, alpha: 0.2)\n    \n    // Ratio\n    public var ratioLabelFont: UIFont? = UIFont(name: \"Verdana-Bold\", size: 16.0)\n    public var ratioLabelFontColor: UIColor? = UIColor.white\n    \n    // Message\n    public var messageLabelFont: UIFont? = UIFont.systemFont(ofSize: 16.0)\n    public var messageLabelFontColor: UIColor? = UIColor.white\n    \n    // Background\n    public var backgroundStyle: BackgroundStyles = .dark\n    \n    // Dismiss\n    public var dismissTimeInterval: Double? = nil // 'nil' for default setting.\n    \n    public init() {}\n}\n"
  },
  {
    "path": "source/Styles/BlueIndicatorStyle.swift",
    "content": "//\n//  BlueIndicatorStyle.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/08/31.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\nimport UIKit\n\npublic struct BlueIndicatorStyle: StyleProperty {\n    // Progress Size\n    public var progressSize: CGFloat = 44\n    \n    // Gradient Circular\n    public var arcLineWidth: CGFloat = 4.0\n    public var startArcColor: UIColor = ColorUtil.toUIColor(r: 235.0, g: 245.0, b: 255.0, a: 1.0)\n    public var endArcColor: UIColor = ColorUtil.toUIColor(r: 0.0, g: 122.0, b: 255.0, a: 1.0)\n    \n    // Base Circular\n    public var baseLineWidth: CGFloat? = 4.0\n    public var baseArcColor: UIColor? = ColorUtil.toUIColor(r: 215.0, g: 215.0, b: 215.0, a: 0.4)\n    \n    // Ratio\n    public var ratioLabelFont: UIFont? = nil\n    public var ratioLabelFontColor: UIColor? = nil\n    \n    // Message\n    public var messageLabelFont: UIFont? = nil\n    public var messageLabelFontColor: UIColor? = nil\n    \n    // Background\n    public var backgroundStyle: BackgroundStyles = .none\n    \n    // Dismiss\n    public var dismissTimeInterval: Double? = nil // 'nil' for default setting.\n    \n    public init() {}\n}\n"
  },
  {
    "path": "source/Styles/GreenLightStyle.swift",
    "content": "//\n//  GreenLightStyle.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/11/24.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\nimport UIKit\n\npublic struct GreenLightStyle: StyleProperty {\n    // Progress Size\n    public var progressSize: CGFloat = 200\n    \n    // Gradient Circular\n    public var arcLineWidth: CGFloat = 32.0\n    public var startArcColor: UIColor = ColorUtil.toUIColor(r: 40.0, g: 110.0, b: 60.0, a: 1.0)\n    public var endArcColor: UIColor = UIColor.green\n    \n    // Base Circular\n    public var baseLineWidth: CGFloat? = 1.0\n    public var baseArcColor: UIColor? = UIColor(red:0.0, green: 0.0, blue: 0.0, alpha: 0.1)\n    \n    // Ratio\n    public var ratioLabelFont: UIFont? = UIFont(name: \"Verdana-Bold\", size: 18.0)\n    public var ratioLabelFontColor: UIColor? = UIColor.darkGray\n    \n    // Message\n    public var messageLabelFont: UIFont? = UIFont(name: \"Verdana\", size: 18.0)\n    public var messageLabelFontColor: UIColor? = UIColor.darkGray\n    \n    // Background\n    public var backgroundStyle: BackgroundStyles = .light\n    \n    // Dismiss\n    public var dismissTimeInterval: Double? = nil // 'nil' for default setting.\n    \n    public init() {}\n}\n"
  },
  {
    "path": "source/Styles/OrangeClearStyle.swift",
    "content": "//\n//  OrangeClearStyle.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/11/24.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\nimport UIKit\n\npublic struct OrangeClearStyle: StyleProperty {\n    // Progress Size\n    public var progressSize: CGFloat = 80\n    \n    // Gradient Circular\n    public var arcLineWidth: CGFloat = 6.0\n    public var startArcColor: UIColor = UIColor.clear\n    public var endArcColor: UIColor = UIColor.orange\n    \n    // Base Circular\n    public var baseLineWidth: CGFloat? = nil\n    public var baseArcColor: UIColor? = nil\n    \n    // Ratio\n    public var ratioLabelFont: UIFont? = UIFont.systemFont(ofSize: 13.0)\n    public var ratioLabelFontColor: UIColor? = UIColor.black\n    \n    // Message\n    public var messageLabelFont: UIFont? = nil\n    public var messageLabelFontColor: UIColor? = nil\n    \n    // Background\n    public var backgroundStyle: BackgroundStyles = .none\n    \n    // Dismiss\n    public var dismissTimeInterval: Double? = nil // 'nil' for default setting.\n    \n    public init() {}\n}\n"
  },
  {
    "path": "source/Styles/Style.swift",
    "content": "//\n//  DefaultStyle.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/08/31.\n//  Copyright (c) 2015年 keygx. All rights reserved.\n//\nimport UIKit\n\npublic struct Style: StyleProperty {\n    // Progress Size\n    public var progressSize: CGFloat = 220\n    \n    // Gradient Circular\n    public var arcLineWidth: CGFloat = 16.0\n    public var startArcColor: UIColor = ColorUtil.toUIColor(r: 230.0, g: 230.0, b: 230.0, a: 0.6)\n    public var endArcColor: UIColor = ColorUtil.toUIColor(r: 90.0, g: 90.0, b: 90.0, a: 1.0)\n    \n    // Base Circular\n    public var baseLineWidth: CGFloat? = 16.0\n    public var baseArcColor: UIColor? = UIColor(red:1.0, green: 1.0, blue: 1.0, alpha: 0.8)\n    \n    // Ratio\n    public var ratioLabelFont: UIFont? = UIFont.systemFont(ofSize: 18.0)\n    public var ratioLabelFontColor: UIColor? = UIColor.black\n    \n    // Message\n    public var messageLabelFont: UIFont? = UIFont.systemFont(ofSize: 18.0)\n    public var messageLabelFontColor: UIColor? = UIColor.black\n    \n    // Background\n    public var backgroundStyle: BackgroundStyles = .extraLight\n    \n    // Dismiss\n    public var dismissTimeInterval: Double? = nil // 'nil' for default setting.\n    \n    public init() {}\n}\n"
  },
  {
    "path": "source/Utils/ColorUtil.swift",
    "content": "//\n//  ColorUtil.swift\n//  GradientCircularProgress\n//\n//  Created by keygx on 2015/11/23.\n//  Copyright © 2015年 keygx. All rights reserved.\n//\n\nimport UIKit\n\npublic class ColorUtil {\n    \n    public class func toUIColor(r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat) -> UIColor {\n        \n        return UIColor(red: r/255.0, green: g/255.0, blue: b/255.0, alpha: a)\n    }\n    \n    internal class func toRGBA(color: UIColor) -> (r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat) {\n        var r: CGFloat = 0.0\n        var g: CGFloat = 0.0\n        var b: CGFloat = 0.0\n        var a: CGFloat = 0.0\n        \n        color.getRed(&r, green: &g, blue: &b, alpha: &a)\n        \n        return (r, g, b, a)\n    }\n    \n    internal class func toNotOpacityColor(color: UIColor) -> UIColor {\n        \n        if color == UIColor.clear {\n            return UIColor.white\n        } else {\n            return UIColor(\n                red: ColorUtil.toRGBA(color: color).r,\n                green: ColorUtil.toRGBA(color: color).g,\n                blue: ColorUtil.toRGBA(color: color).b,\n                alpha: 1.0)\n        }\n    }\n}\n"
  }
]