[
  {
    "path": ".gitignore",
    "content": "build/\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.DS_Store\n"
  },
  {
    "path": ".swift-version",
    "content": "4\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (c) 2014-2015 Meng To (meng@designcode.io)\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.\n"
  },
  {
    "path": "README.md",
    "content": "## Updated for Swift 4.2\nRequires Xcode 10 and Swift 4.2.\n\n## Installation\nDrop in the Spring folder to your Xcode project (make sure to enable \"Copy items if needed\" and \"Create groups\").\n\nOr via CocoaPods:\n```\nuse_frameworks!\npod 'Spring', :git => 'https://github.com/MengTo/Spring.git'\n```\n\n## Usage with Storyboard\nIn Identity Inspector, connect the UIView to SpringView Class and set the animation properties in Attribute Inspector.\n\n![](http://cl.ly/image/241o0G1G3S36/download/springsetup.jpg)\n\n## Usage with Code\n    layer.animation = \"squeezeDown\"\n    layer.animate()\n\n## Demo The Animations\n![](http://cl.ly/image/1n1E2j3W3y24/springscreen.jpg)\n\n## Chaining Animations\n    layer.y = -50\n    animateToNext {\n      layer.animation = \"fall\"\n      layer.animateTo()\n    }\n\n## Functions\n    animate()\n    animateNext { ... }\n    animateTo()\n    animateToNext { ... }\n\n## Animation\n    shake\n    pop\n    morph\n    squeeze\n    wobble\n    swing\n    flipX\n    flipY\n    fall\n    squeezeLeft\n    squeezeRight\n    squeezeDown\n    squeezeUp\n    slideLeft\n    slideRight\n    slideDown\n    slideUp\n    fadeIn\n    fadeOut\n    fadeInLeft\n    fadeInRight\n    fadeInDown\n    fadeInUp\n    zoomIn\n    zoomOut\n    flash\n\n## Curve\n    spring\n    linear\n    easeIn\n    easeOut\n    easeInOut\n\n## Properties\n    force\n    duration\n    delay\n    damping\n    velocity\n    repeatCount\n    scale\n    x\n    y\n    rotate\n\n\\* Not all properties work together. Play with the demo app.\n\n\n## Autostart\nAllows you to animate without code. Don't need to use this if you plan to start the animation in code.\n\n## Autohide\nSaves you the hassle of adding a line \"layer.alpha = 0\" in viewDidLoad().\n\n## Known issue\nAnimations won't autostart when view is reached via performSegueWithIdentifier.\n\n## Tutorials\n- Tutorials available on [Design+Code](https://designcode.io/swiftapp).\n- [Integrate Spring to existing Objective-C projects](https://medium.com/ios-apprentice/using-swift-in-objective-c-projects-f7e7a09f8be)\n\n## ChangeLog\n- At [ChangeLog](https://github.com/MengTo/Spring/wiki/CHANGELOG) wiki page\n\n## License\n\nSpring is released under the MIT license. See LICENSE for details.\n"
  },
  {
    "path": "Spring/AsyncButton.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2015 James Tang (j@jamztang.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport UIKit\n\npublic class AsyncButton: UIButton {\n    \n    private var imageURL = [UInt:NSURL]()\n    private var placeholderImage = [UInt:UIImage]()\n    \n    \n    public func setImageURL(url: NSURL?, placeholderImage placeholder:UIImage?, forState state:UIControl.State) {\n        \n        imageURL[state.rawValue] = url\n        placeholderImage[state.rawValue] = placeholder\n        \n        if let urlString = url?.absoluteString {\n            ImageLoader.sharedLoader.imageForUrl(urlString: urlString) { [weak self] image, url in\n                \n                if let strongSelf = self {\n                    \n                    DispatchQueue.main.async(execute: { () -> Void in\n                        if strongSelf.imageURL[state.rawValue]?.absoluteString == url {\n                            strongSelf.setImage(image, for: state)\n                        }\n                    })\n                }\n            }\n        }\n    }\n    \n}\n"
  },
  {
    "path": "Spring/AsyncImageView.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2015 James Tang (j@jamztang.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport UIKit\n\npublic class AsyncImageView: UIImageView {\n\n    public var placeholderImage : UIImage?\n\n    public var url : NSURL? {\n        didSet {\n            self.image = placeholderImage\n            if let urlString = url?.absoluteString {\n                ImageLoader.sharedLoader.imageForUrl(urlString: urlString) { [weak self] image, url in\n                    if let strongSelf = self {\n                        DispatchQueue.main.async(execute: { () -> Void in\n                            if strongSelf.url?.absoluteString == url {\n                                strongSelf.image = image ?? strongSelf.placeholderImage\n                            }\n                        })\n                    }\n                }\n            }\n        }\n    }\n\n    public func setURL(url: NSURL?, placeholderImage: UIImage?) {\n        self.placeholderImage = placeholderImage\n        self.url = url\n    }\n\n}\n"
  },
  {
    "path": "Spring/AutoTextView.swift",
    "content": "//\n//  AutoTextView.swift\n//  SpringApp\n//\n//  Created by Meng To on 2015-03-27.\n//  Copyright (c) 2015 Meng To. All rights reserved.\n//\n\nimport UIKit\n\npublic class AutoTextView: UITextView {\n\n    public override var intrinsicContentSize: CGSize {\n        get {\n            var size = self.sizeThatFits(CGSize(width: self.frame.size.width, height: CGFloat.greatestFiniteMagnitude))\n            size.width = self.frame.size.width\n            if text.length == 0 {\n                size.height = 0\n            }\n            \n            contentInset = UIEdgeInsets(top: -4, left: -4, bottom: -4, right: -4)\n            layoutIfNeeded()\n            \n            return size\n        }\n    }\n}\n"
  },
  {
    "path": "Spring/BlurView.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2015 Meng To (meng@designcode.io)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport UIKit\n\npublic func insertBlurView (view: UIView, style: UIBlurEffect.Style) -> UIVisualEffectView {\n    view.backgroundColor = UIColor.clear\n    \n    let blurEffect = UIBlurEffect(style: style)\n    let blurEffectView = UIVisualEffectView(effect: blurEffect)\n    blurEffectView.frame = view.bounds\n    view.insertSubview(blurEffectView, at: 0)\n    return blurEffectView\n}\n"
  },
  {
    "path": "Spring/DesignableButton.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2015 Meng To (meng@designcode.io)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport UIKit\n\n@IBDesignable public class DesignableButton: SpringButton {\n\n    @IBInspectable public var borderColor: UIColor = UIColor.clear {\n        didSet {\n            layer.borderColor = borderColor.cgColor\n        }\n    }\n    \n    @IBInspectable public var borderWidth: CGFloat = 0 {\n        didSet {\n            layer.borderWidth = borderWidth\n        }\n    }\n    \n    @IBInspectable public var cornerRadius: CGFloat = 0 {\n        didSet {\n            layer.cornerRadius = cornerRadius\n        }\n    }\n    \n    @IBInspectable public var shadowColor: UIColor = UIColor.clear {\n        didSet {\n            layer.shadowColor = shadowColor.cgColor\n        }\n    }\n    \n    @IBInspectable public var shadowRadius: CGFloat = 0 {\n        didSet {\n            layer.shadowRadius = shadowRadius\n        }\n    }\n    \n    @IBInspectable public var shadowOpacity: CGFloat = 0 {\n        didSet {\n            layer.shadowOpacity = Float(shadowOpacity)\n        }\n    }\n    \n    @IBInspectable public var shadowOffsetY: CGFloat = 0 {\n        didSet {\n            layer.shadowOffset.height = shadowOffsetY\n        }\n    }\n\n}\n"
  },
  {
    "path": "Spring/DesignableImageView.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2015 Meng To (meng@designcode.io)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport UIKit\n\n@IBDesignable public class DesignableImageView: SpringImageView {\n    \n    @IBInspectable public var borderColor: UIColor = UIColor.clear {\n        didSet {\n            layer.borderColor = borderColor.cgColor\n        }\n    }\n    \n    @IBInspectable public var borderWidth: CGFloat = 0 {\n        didSet {\n            layer.borderWidth = borderWidth\n        }\n    }\n    \n    @IBInspectable public var cornerRadius: CGFloat = 0 {\n        didSet {\n            layer.cornerRadius = cornerRadius\n        }\n    }\n\n}\n"
  },
  {
    "path": "Spring/DesignableLabel.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2015 Meng To (meng@designcode.io)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport UIKit\n\n@IBDesignable public class DesignableLabel: SpringLabel {\n\n    @IBInspectable public var lineHeight: CGFloat = 1.5 {\n        didSet {\n            let font = UIFont(name: self.font.fontName, size: self.font.pointSize)\n            guard let text = self.text else { return }\n            \n            let paragraphStyle = NSMutableParagraphStyle()\n            paragraphStyle.lineSpacing = lineHeight\n            \n            let attributedString = NSMutableAttributedString(string: text)\n            attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value: paragraphStyle, range: NSMakeRange(0, attributedString.length))\n            attributedString.addAttribute(NSAttributedString.Key.font, value: font!, range: NSMakeRange(0, attributedString.length))\n            \n            self.attributedText = attributedString\n        }\n    }\n\n}\n"
  },
  {
    "path": "Spring/DesignableTabBarController.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2015 Meng To (meng@designcode.io)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport UIKit\n\n@IBDesignable class DesignableTabBarController: UITabBarController {\n    \n    @IBInspectable var normalTint: UIColor = UIColor.clear {\n        didSet {\n            UITabBar.appearance().tintColor = normalTint\n            UITabBarItem.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor: normalTint], for: UIControl.State())\n        }\n    }\n    \n    @IBInspectable var selectedTint: UIColor = UIColor.clear {\n        didSet {\n            UITabBar.appearance().tintColor = selectedTint\n            UITabBarItem.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor: selectedTint], for:UIControl.State.selected)\n        }\n    }\n    \n    @IBInspectable var fontName: String = \"\" {\n        didSet {\n            UITabBarItem.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor: normalTint, NSAttributedString.Key.font: UIFont(name: fontName, size: 11)!], for: UIControl.State())\n        }\n    }\n    \n    @IBInspectable var firstSelectedImage: UIImage? {\n        didSet {\n            if let image = firstSelectedImage {\n                var tabBarItems = self.tabBar.items as [UITabBarItem]?\n                tabBarItems?[0].selectedImage = image.withRenderingMode(UIImage.RenderingMode.alwaysTemplate)\n            }\n        }\n    }\n    \n    @IBInspectable var secondSelectedImage: UIImage? {\n        didSet {\n            if let image = secondSelectedImage {\n                var tabBarItems = self.tabBar.items as [UITabBarItem]?\n                tabBarItems?[1].selectedImage = image.withRenderingMode(UIImage.RenderingMode.alwaysTemplate)\n            }\n        }\n    }\n    \n    @IBInspectable var thirdSelectedImage: UIImage? {\n        didSet {\n            if let image = thirdSelectedImage {\n                var tabBarItems = self.tabBar.items as [UITabBarItem]?\n                tabBarItems?[2].selectedImage = image.withRenderingMode(UIImage.RenderingMode.alwaysTemplate)\n            }\n        }\n    }\n    \n    @IBInspectable var fourthSelectedImage: UIImage? {\n        didSet {\n            if let image = fourthSelectedImage {\n                var tabBarItems = self.tabBar.items as [UITabBarItem]?\n                tabBarItems?[3].selectedImage = image.withRenderingMode(UIImage.RenderingMode.alwaysTemplate)\n            }\n        }\n    }\n    \n    @IBInspectable var fifthSelectedImage: UIImage? {\n        didSet {\n            if let image = fifthSelectedImage {\n                var tabBarItems = self.tabBar.items as [UITabBarItem]?\n                tabBarItems?[4].selectedImage = image.withRenderingMode(UIImage.RenderingMode.alwaysTemplate)\n            }\n        }\n    }\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        if let items = self.tabBar.items {\n            for item in items {\n                if let image = item.image {\n                    item.image = image.imageWithColor(tintColor: self.normalTint).withRenderingMode(UIImage.RenderingMode.alwaysOriginal)\n                }\n            }\n        }\n    }\n}\n\nextension UIImage {\n    func imageWithColor(tintColor: UIColor) -> UIImage {\n        UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)\n        \n        let context = UIGraphicsGetCurrentContext()\n        context!.translateBy(x: 0, y: self.size.height)\n        context!.scaleBy(x: 1.0, y: -1.0);\n        context!.setBlendMode(CGBlendMode.normal)\n        \n        let rect = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height)\n        context?.clip(to: rect, mask: self.cgImage!)\n        tintColor.setFill()\n        context!.fill(rect)\n        \n        let newImage = UIGraphicsGetImageFromCurrentImageContext()! as UIImage\n        UIGraphicsEndImageContext()\n        \n        return newImage\n    }\n}\n"
  },
  {
    "path": "Spring/DesignableTextField.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2015 Meng To (meng@designcode.io)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport UIKit\n\n@IBDesignable public class DesignableTextField: SpringTextField {\n    \n    @IBInspectable public var placeholderColor: UIColor = UIColor.clear {\n        didSet {\n            guard let placeholder = placeholder else { return }\n            attributedPlaceholder = NSAttributedString(string: placeholder, attributes: [NSAttributedString.Key.foregroundColor: placeholderColor])\n            layoutSubviews()\n            \n        }\n    }\n    \n    @IBInspectable public var sidePadding: CGFloat = 0 {\n        didSet {\n            let padding = UIView(frame: CGRect(x: 0, y: 0, width: sidePadding, height: sidePadding))\n            \n            leftViewMode = UITextField.ViewMode.always\n            leftView = padding\n            \n            rightViewMode = UITextField.ViewMode.always\n            rightView = padding\n        }\n    }\n    \n    @IBInspectable public var leftPadding: CGFloat = 0 {\n        didSet {\n            let padding = UIView(frame: CGRect(x: 0, y: 0, width: leftPadding, height: 0))\n            \n            leftViewMode = UITextField.ViewMode.always\n            leftView = padding\n        }\n    }\n    \n    @IBInspectable public var rightPadding: CGFloat = 0 {\n        didSet {\n            let padding = UIView(frame: CGRect(x: 0, y: 0, width: rightPadding, height: 0))\n            \n            rightViewMode = UITextField.ViewMode.always\n            rightView = padding\n        }\n    }\n    \n    @IBInspectable public var borderColor: UIColor = UIColor.clear {\n        didSet {\n            layer.borderColor = borderColor.cgColor\n        }\n    }\n    \n    @IBInspectable public var borderWidth: CGFloat = 0 {\n        didSet {\n            layer.borderWidth = borderWidth\n        }\n    }\n    \n    @IBInspectable public var cornerRadius: CGFloat = 0 {\n        didSet {\n            layer.cornerRadius = cornerRadius\n        }\n    }\n   \n    @IBInspectable public var lineHeight: CGFloat = 1.5 {\n        didSet {\n            let font = UIFont(name: self.font!.fontName, size: self.font!.pointSize)\n            guard let text = self.text else { return }\n            \n            let paragraphStyle = NSMutableParagraphStyle()\n            paragraphStyle.lineSpacing = lineHeight\n            \n            let attributedString = NSMutableAttributedString(string: text)\n            attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: attributedString.length))\n            attributedString.addAttribute(NSAttributedString.Key.font, value: font!, range: NSRange(location: 0, length: attributedString.length))\n            \n            self.attributedText = attributedString\n        }\n    }\n    \n}\n"
  },
  {
    "path": "Spring/DesignableTextView.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2015 Meng To (meng@designcode.io)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport UIKit\n\n@IBDesignable public class DesignableTextView: SpringTextView {\n    \n    @IBInspectable public var borderColor: UIColor = UIColor.clear {\n        didSet {\n            layer.borderColor = borderColor.cgColor\n        }\n    }\n    \n    @IBInspectable public var borderWidth: CGFloat = 0 {\n        didSet {\n            layer.borderWidth = borderWidth\n        }\n    }\n    \n    @IBInspectable public var cornerRadius: CGFloat = 0 {\n        didSet {\n            layer.cornerRadius = cornerRadius\n        }\n    }\n    \n    @IBInspectable public var lineHeight: CGFloat = 1.5 {\n        didSet {\n            let font = UIFont(name: self.font!.fontName, size: self.font!.pointSize)\n            guard let text = self.text else { return }\n            \n            let paragraphStyle = NSMutableParagraphStyle()\n            paragraphStyle.lineSpacing = lineHeight\n            \n            let attributedString = NSMutableAttributedString(string: text)\n            attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: attributedString.length))\n            attributedString.addAttribute(NSAttributedString.Key.font, value: font!, range: NSRange(location: 0, length: attributedString.length))\n            \n            self.attributedText = attributedString\n        }\n    }\n    \n}\n"
  },
  {
    "path": "Spring/DesignableView.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2015 Meng To (meng@designcode.io)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport UIKit\n\n@IBDesignable public class DesignableView: SpringView {\n    \n    @IBInspectable public var borderColor: UIColor = UIColor.clear {\n        didSet {\n            layer.borderColor = borderColor.cgColor\n        }\n    }\n    \n    @IBInspectable public var borderWidth: CGFloat = 0 {\n        didSet {\n            layer.borderWidth = borderWidth\n        }\n    }\n    \n    @IBInspectable public var cornerRadius: CGFloat = 0 {\n        didSet {\n            layer.cornerRadius = cornerRadius\n        }\n    }\n    \n    @IBInspectable public var shadowColor: UIColor = UIColor.clear {\n        didSet {\n            layer.shadowColor = shadowColor.cgColor\n        }\n    }\n    \n    @IBInspectable public var shadowRadius: CGFloat = 0 {\n        didSet {\n            layer.shadowRadius = shadowRadius\n        }\n    }\n    \n    @IBInspectable public var shadowOpacity: CGFloat = 0 {\n        didSet {\n            layer.shadowOpacity = Float(shadowOpacity)\n        }\n    }\n    \n    @IBInspectable public var shadowOffsetY: CGFloat = 0 {\n        didSet {\n            layer.shadowOffset.height = shadowOffsetY\n        }\n    }\n}\n"
  },
  {
    "path": "Spring/ImageLoader.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2014 Nate Lyman (https://github.com/natelyman/SwiftImageLoader)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport UIKit\nimport Foundation\n\n\npublic class ImageLoader {\n    \n    var cache = NSCache<NSString, NSData>()\n    \n    public class var sharedLoader : ImageLoader {\n        struct Static {\n            static let instance : ImageLoader = ImageLoader()\n        }\n        return Static.instance\n    }\n    \n    public func imageForUrl(urlString: String, completionHandler: @escaping(_ image: UIImage?, _ url: String) -> ()) {\n        DispatchQueue.global(qos: DispatchQoS.QoSClass.background).async { \n            var data: NSData?\n            \n            if let dataCache = self.cache.object(forKey: urlString as NSString){\n                data = (dataCache) as NSData\n                \n            }else{\n                if (URL(string: urlString) != nil)\n                {\n                    data = NSData(contentsOf: URL(string: urlString)!)\n                    if data != nil {\n                        self.cache.setObject(data!, forKey: urlString as NSString)\n                    }\n                }else{\n                    return\n                }\n            }\n            \n            if let goodData = data {\n                let image = UIImage(data: goodData as Data)\n                DispatchQueue.main.async(execute: {() in\n                    completionHandler(image, urlString)\n                })\n                return\n            }\n            \n            let downloadTask: URLSessionDataTask = URLSession.shared.dataTask(with: URL(string: urlString)!, completionHandler: { (data, response, error) -> Void in\n                \n                if (error != nil) {\n                    completionHandler(nil, urlString)\n                    return\n                }\n                \n                if data != nil {\n                    let image = UIImage(data: data!)\n                    self.cache.setObject(data! as NSData, forKey: urlString as NSString)\n                    DispatchQueue.main.async(execute: {() in\n                        completionHandler(image, urlString)\n                    })\n                    return\n                }\n            })\n            downloadTask.resume()\n            \n        }\n        \n    }\n}\n"
  },
  {
    "path": "Spring/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>1.0</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": "Spring/KeyboardLayoutConstraint.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2015 James Tang (j@jamztang.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport UIKit\n\n#if !os(tvOS)\n@available(tvOS, unavailable)\npublic class KeyboardLayoutConstraint: NSLayoutConstraint {\n    \n    private var offset : CGFloat = 0\n    private var keyboardVisibleHeight : CGFloat = 0\n    \n    @available(tvOS, unavailable)\n    override public func awakeFromNib() {\n        super.awakeFromNib()\n        \n        offset = constant\n        \n        NotificationCenter.default.addObserver(self, selector: #selector(KeyboardLayoutConstraint.keyboardWillShowNotification(_:)), name: UIWindow.keyboardWillShowNotification, object: nil)\n        NotificationCenter.default.addObserver(self, selector: #selector(KeyboardLayoutConstraint.keyboardWillHideNotification(_:)), name: UIWindow.keyboardWillHideNotification, object: nil)\n    }\n    \n    deinit {\n        NotificationCenter.default.removeObserver(self)\n    }\n    \n    // MARK: Notification\n    \n    @objc func keyboardWillShowNotification(_ notification: Notification) {\n        if let userInfo = notification.userInfo {\n            if let frameValue = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {\n                let frame = frameValue.cgRectValue\n                keyboardVisibleHeight = frame.size.height\n            }\n            \n            self.updateConstant()\n            switch (userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber, userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? NSNumber) {\n            case let (.some(duration), .some(curve)):\n                \n                let options = UIView.AnimationOptions(rawValue: curve.uintValue)\n                \n                UIView.animate(\n                    withDuration: TimeInterval(duration.doubleValue),\n                    delay: 0,\n                    options: options,\n                    animations: {\n                        UIApplication.shared.keyWindow?.layoutIfNeeded()\n                        return\n                    }, completion: { finished in\n                })\n            default:\n                \n                break\n            }\n            \n        }\n        \n    }\n    \n    @objc func keyboardWillHideNotification(_ notification: NSNotification) {\n        keyboardVisibleHeight = 0\n        self.updateConstant()\n        \n        if let userInfo = notification.userInfo {\n            \n            switch (userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber, userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? NSNumber) {\n            case let (.some(duration), .some(curve)):\n                \n                let options = UIView.AnimationOptions(rawValue: curve.uintValue)\n                \n                UIView.animate(\n                    withDuration: TimeInterval(duration.doubleValue),\n                    delay: 0,\n                    options: options,\n                    animations: {\n                        UIApplication.shared.keyWindow?.layoutIfNeeded()\n                        return\n                    }, completion: { finished in\n                })\n            default:\n                break\n            }\n        }\n    }\n    \n    func updateConstant() {\n        self.constant = offset + keyboardVisibleHeight\n    }\n    \n}\n#endif\n"
  },
  {
    "path": "Spring/LoadingView.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2015 Meng To (meng@designcode.io)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport UIKit\n\n#if !os(tvOS)\n@available(tvOS, unavailable)\npublic class LoadingView: UIView {\n\n    @IBOutlet public weak var indicatorView: SpringView!\n\n    override public func awakeFromNib() {\n        let animation = CABasicAnimation()\n        animation.keyPath = \"transform.rotation.z\"\n        animation.fromValue = degreesToRadians(degrees: 0)\n        animation.toValue = degreesToRadians(degrees: 360)\n        animation.duration = 0.9\n        animation.repeatCount = HUGE\n        indicatorView.layer.add(animation, forKey: \"\")\n    }\n\n    class func designCodeLoadingView() -> UIView {\n        \n        return Bundle(for: self).loadNibNamed(\"LoadingView\", owner: self, options: nil)![0] as! UIView\n    }\n}\n\npublic extension UIView {\n\n    struct LoadingViewConstants {\n        static let Tag = 1000\n    }\n\n    public func showLoading() {\n\n        if self.viewWithTag(LoadingViewConstants.Tag) != nil {\n            // If loading view is already found in current view hierachy, do nothing\n            return\n        }\n\n        let loadingXibView = LoadingView.designCodeLoadingView()\n        loadingXibView.frame = self.bounds\n        loadingXibView.tag = LoadingViewConstants.Tag\n        self.addSubview(loadingXibView)\n\n        loadingXibView.alpha = 0\n        SpringAnimation.spring(duration: 0.7, animations: {\n            loadingXibView.alpha = 1\n        })\n    }\n\n    public func hideLoading() {\n\n        if let loadingXibView = self.viewWithTag(LoadingViewConstants.Tag) {\n            loadingXibView.alpha = 1\n\n            SpringAnimation.springWithCompletion(duration: 0.7, animations: {\n                loadingXibView.alpha = 0\n                loadingXibView.transform = CGAffineTransform(scaleX: 3, y: 3)\n            }, completion: { (completed) -> Void in\n                loadingXibView.removeFromSuperview()\n            })\n        }\n    }\n\n}\n#endif\n"
  },
  {
    "path": "Spring/LoadingView.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"6254\" systemVersion=\"14B25\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"6247\"/>\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=\"2ih-bH-VRI\" customClass=\"LoadingView\" customModule=\"Spring\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"19J-d9-rcw\" customClass=\"SpringView\" customModule=\"Spring\" customModuleProvider=\"target\">\n                    <rect key=\"frame\" x=\"275\" y=\"275\" width=\"50\" height=\"50\"/>\n                    <subviews>\n                        <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"loading\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"e5h-jP-Opi\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"50\" height=\"50\"/>\n                            <constraints>\n                                <constraint firstAttribute=\"width\" constant=\"50\" id=\"Dtw-Z1-4UD\"/>\n                                <constraint firstAttribute=\"height\" constant=\"50\" id=\"rHT-mc-g8o\"/>\n                            </constraints>\n                        </imageView>\n                    </subviews>\n                    <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"calibratedWhite\"/>\n                    <constraints>\n                        <constraint firstAttribute=\"centerY\" secondItem=\"e5h-jP-Opi\" secondAttribute=\"centerY\" id=\"094-1B-RGw\"/>\n                        <constraint firstAttribute=\"height\" constant=\"50\" id=\"1hh-Ra-6oa\"/>\n                        <constraint firstAttribute=\"width\" constant=\"50\" id=\"XXZ-SW-6d9\"/>\n                        <constraint firstAttribute=\"centerX\" secondItem=\"e5h-jP-Opi\" secondAttribute=\"centerX\" id=\"aTG-c6-H6d\"/>\n                    </constraints>\n                </view>\n            </subviews>\n            <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"calibratedWhite\"/>\n            <constraints>\n                <constraint firstAttribute=\"centerY\" secondItem=\"19J-d9-rcw\" secondAttribute=\"centerY\" id=\"DlX-dJ-y4A\"/>\n                <constraint firstAttribute=\"centerX\" secondItem=\"19J-d9-rcw\" secondAttribute=\"centerX\" id=\"iTf-dQ-2Ho\"/>\n            </constraints>\n            <connections>\n                <outlet property=\"indicatorView\" destination=\"19J-d9-rcw\" id=\"WZZ-6H-whz\"/>\n            </connections>\n        </view>\n    </objects>\n    <resources>\n        <image name=\"loading\" width=\"40\" height=\"40\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "Spring/Misc.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2015 Meng To (meng@designcode.io)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport UIKit\n\npublic extension String {\n    var length: Int { return self.count }\n    \n    func toURL() -> NSURL? {\n        return NSURL(string: self)\n    }\n}\n\npublic func htmlToAttributedString(text: String) -> NSAttributedString! {\n    guard let htmlData = text.data(using: String.Encoding.utf8, allowLossyConversion: false) else {\n        return NSAttributedString() }\n    let htmlString: NSAttributedString?\n    do {\n        htmlString = try NSAttributedString(data: htmlData, options: [NSAttributedString.DocumentReadingOptionKey.documentType:NSAttributedString.DocumentType.html], documentAttributes: nil)\n    } catch _ {\n        htmlString = nil\n    }\n    \n    return htmlString\n}\n\npublic func degreesToRadians(degrees: CGFloat) -> CGFloat {\n    return degrees * CGFloat(CGFloat.pi / 180)\n}\n\npublic func delay(delay:Double, closure: @escaping ()->()) {\n    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: closure)\n}\n\npublic func imageFromURL(_ Url: String) -> UIImage {\n    let url = Foundation.URL(string: Url)\n    let data = try? Data(contentsOf: url!)\n    return UIImage(data: data!)!\n}\n\npublic extension UIColor {\n    convenience init(hex: String) {\n        var red:   CGFloat = 0.0\n        var green: CGFloat = 0.0\n        var blue:  CGFloat = 0.0\n        var alpha: CGFloat = 1.0\n        var hex:   String = hex\n        \n        if hex.hasPrefix(\"#\") {\n            let index = hex.index(hex.startIndex, offsetBy: 1)\n            hex = String(hex[index...])\n        }\n        \n        let scanner = Scanner(string: hex)\n        var hexValue: CUnsignedLongLong = 0\n        if scanner.scanHexInt64(&hexValue) {\n            switch (hex.count) {\n            case 3:\n                red   = CGFloat((hexValue & 0xF00) >> 8)       / 15.0\n                green = CGFloat((hexValue & 0x0F0) >> 4)       / 15.0\n                blue  = CGFloat(hexValue & 0x00F)              / 15.0\n            case 4:\n                red   = CGFloat((hexValue & 0xF000) >> 12)     / 15.0\n                green = CGFloat((hexValue & 0x0F00) >> 8)      / 15.0\n                blue  = CGFloat((hexValue & 0x00F0) >> 4)      / 15.0\n                alpha = CGFloat(hexValue & 0x000F)             / 15.0\n            case 6:\n                red   = CGFloat((hexValue & 0xFF0000) >> 16)   / 255.0\n                green = CGFloat((hexValue & 0x00FF00) >> 8)    / 255.0\n                blue  = CGFloat(hexValue & 0x0000FF)           / 255.0\n            case 8:\n                red   = CGFloat((hexValue & 0xFF000000) >> 24) / 255.0\n                green = CGFloat((hexValue & 0x00FF0000) >> 16) / 255.0\n                blue  = CGFloat((hexValue & 0x0000FF00) >> 8)  / 255.0\n                alpha = CGFloat(hexValue & 0x000000FF)         / 255.0\n            default:\n                print(\"Invalid RGB string, number of characters after '#' should be either 3, 4, 6 or 8\", terminator: \"\")\n            }\n        } else {\n            print(\"Scan hex error\")\n        }\n        self.init(red:red, green:green, blue:blue, alpha:alpha)\n    }\n}\n\npublic func rgbaToUIColor(red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) -> UIColor {\n    \n    return UIColor(red: red, green: green, blue: blue, alpha: alpha)\n}\n\npublic func UIColorFromRGB(rgbValue: UInt) -> UIColor {\n    return UIColor(\n        red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,\n        green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,\n        blue: CGFloat(rgbValue & 0x0000FF) / 255.0,\n        alpha: CGFloat(1.0)\n    )\n}\n\npublic func stringFromDate(date: NSDate, format: String) -> String {\n    let dateFormatter = DateFormatter()\n    dateFormatter.dateFormat = format\n    return dateFormatter.string(from: date as Date)\n}\n\npublic func dateFromString(date: String, format: String) -> Date {\n    let dateFormatter = DateFormatter()\n    dateFormatter.dateFormat = format\n    if let date = dateFormatter.date(from: date) {\n        return date\n    } else {\n        return Date(timeIntervalSince1970: 0)\n    }\n}\n\npublic func randomStringWithLength (len : Int) -> NSString {\n    \n    let letters : NSString = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\"\n    \n    let randomString : NSMutableString = NSMutableString(capacity: len)\n    \n    for _ in 0 ..< len {\n        let length = UInt32 (letters.length)\n        let rand = arc4random_uniform(length)\n        randomString.appendFormat(\"%C\", letters.character(at: Int(rand)))\n    }\n    \n    return randomString\n}\n\npublic func timeAgoSinceDate(date: Date, numericDates: Bool) -> String {\n    let calendar = Calendar.current\n    let unitFlags = Set<Calendar.Component>(arrayLiteral: Calendar.Component.minute, Calendar.Component.hour, Calendar.Component.day, Calendar.Component.weekOfYear, Calendar.Component.month, Calendar.Component.year, Calendar.Component.second)\n    let now = Date()\n    let dateComparison = now.compare(date)\n    var earliest: Date\n    var latest: Date\n    \n    switch dateComparison {\n    case .orderedAscending:\n        earliest = now\n        latest = date\n    default:\n        earliest = date\n        latest = now\n    }\n    \n    let components: DateComponents = calendar.dateComponents(unitFlags, from: earliest, to: latest)\n    \n    guard\n        let year = components.year,\n        let month = components.month,\n        let weekOfYear = components.weekOfYear,\n        let day = components.day,\n        let hour = components.hour,\n        let minute = components.minute,\n        let second = components.second\n        else {\n        fatalError()\n    }\n    \n    if (year >= 2) {\n        return \"\\(year)y\"\n    } else if (year >= 1) {\n        if (numericDates){\n            return \"1y\"\n        } else {\n            return \"1y\"\n        }\n    } else if (month >= 2) {\n        return \"\\(month * 4)w\"\n    } else if (month >= 1) {\n        if (numericDates){\n            return \"4w\"\n        } else {\n            return \"4w\"\n        }\n    } else if (weekOfYear >= 2) {\n        return \"\\(weekOfYear)w\"\n    } else if (weekOfYear >= 1){\n        if (numericDates){\n            return \"1w\"\n        } else {\n            return \"1w\"\n        }\n    } else if (day >= 2) {\n        return \"\\(components.day ?? 2)d\"\n    } else if (day >= 1){\n        if (numericDates){\n            return \"1d\"\n        } else {\n            return \"1d\"\n        }\n    } else if (hour >= 2) {\n        return \"\\(hour)h\"\n    } else if (hour >= 1){\n        if (numericDates){\n            return \"1h\"\n        } else {\n            return \"1h\"\n        }\n    } else if (minute >= 2) {\n        return \"\\(minute)m\"\n    } else if (minute >= 1){\n        if (numericDates){\n            return \"1m\"\n        } else {\n            return \"1m\"\n        }\n    } else if (second >= 3) {\n        return \"\\(second)s\"\n    } else {\n        return \"now\"\n    }\n    \n}\n\nextension UIImageView {\n    func setImage(url: URL, contentMode mode: UIView.ContentMode = .scaleAspectFit, placeholderImage: UIImage?) {\n        contentMode = mode\n        URLSession.shared.dataTask(with: url) { (data, response, error) in\n            guard\n                let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,\n                let mimeType = response?.mimeType, mimeType.hasPrefix(\"image\"),\n                let data = data, error == nil,\n                let image = UIImage(data: data)\n                else {\n                    self.image = placeholderImage\n                    return\n            }\n            DispatchQueue.main.async() { () -> Void in\n                self.image = image\n                \n            }\n            }.resume()\n    }\n    func setImage(urlString: String, contentMode mode: UIView.ContentMode = .scaleAspectFit, placeholderImage: UIImage?) {\n        guard let url = URL(string: urlString) else {\n            image = placeholderImage\n            return\n        }\n        setImage(url: url, contentMode: mode, placeholderImage: placeholderImage)\n    }\n}\n"
  },
  {
    "path": "Spring/SoundPlayer.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2015 James Tang (j@jamztang.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport UIKit\nimport AudioToolbox\n\npublic struct SoundPlayer {\n    \n    static var filename : String?\n    static var enabled : Bool = true\n    \n    private struct Internal {\n        static var cache = [URL:SystemSoundID]()\n    }\n    \n    public static func playSound(soundFile: String) {\n        \n        if !enabled {\n            return\n        }\n        \n        if let url = Bundle.main.url(forResource: soundFile, withExtension: nil) {\n            \n            var soundID : SystemSoundID = Internal.cache[url] ?? 0\n            \n            if soundID == 0 {\n                AudioServicesCreateSystemSoundID(url as CFURL, &soundID)\n                Internal.cache[url] = soundID\n            }\n            \n            AudioServicesPlaySystemSound(soundID)\n            \n        } else {\n            print(\"Could not find sound file name `\\(soundFile)`\")\n        }\n    }\n    \n    static func play(file: String) {\n        self.playSound(soundFile: file)\n    }\n}\n"
  },
  {
    "path": "Spring/Spring.h",
    "content": "//\n//  Spring.h\n//  Spring\n//\n//  Created by James Tang on 20/1/15.\n//  Copyright (c) 2015 Meng To. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n//! Project version number for Spring.\nFOUNDATION_EXPORT double SpringVersionNumber;\n\n//! Project version string for Spring.\nFOUNDATION_EXPORT const unsigned char SpringVersionString[];\n\n// In this header, you should import all the public headers of your framework using statements like #import <Spring/PublicHeader.h>\n\n\n"
  },
  {
    "path": "Spring/Spring.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2015 Meng To (meng@designcode.io)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport UIKit\n\n@objc public protocol Springable {\n    var autostart: Bool  { get set }\n    var autohide: Bool  { get set }\n    var animation: String  { get set }\n    var force: CGFloat  { get set }\n    var delay: CGFloat { get set }\n    var duration: CGFloat { get set }\n    var damping: CGFloat { get set }\n    var velocity: CGFloat { get set }\n    var repeatCount: Float { get set }\n    var x: CGFloat { get set }\n    var y: CGFloat { get set }\n    var scaleX: CGFloat { get set }\n    var scaleY: CGFloat { get set }\n    var rotate: CGFloat { get set }\n    var opacity: CGFloat { get set }\n    var animateFrom: Bool { get set }\n    var curve: String { get set }\n    \n    // UIView\n    var layer : CALayer { get }\n    var transform : CGAffineTransform { get set }\n    var alpha : CGFloat { get set }\n    \n    func animate()\n    func animateNext(completion: @escaping () -> ())\n    func animateTo()\n    func animateToNext(completion: @escaping () -> ())\n}\n\npublic class Spring : NSObject {\n    \n    private unowned var view : Springable\n    private var shouldAnimateAfterActive = false\n    private var shouldAnimateInLayoutSubviews = true\n    \n    init(_ view: Springable) {\n        self.view = view\n        super.init()\n        commonInit()\n    }\n    \n    func commonInit() {\n        NotificationCenter.default.addObserver(self, selector: #selector(Spring.didBecomeActiveNotification(_:)), name: UIApplication.didBecomeActiveNotification, object: nil)\n    }\n    \n    @objc func didBecomeActiveNotification(_ notification: NSNotification) {\n        if shouldAnimateAfterActive {\n            alpha = 0\n            animate()\n            shouldAnimateAfterActive = false\n        }\n    }\n    \n    deinit {\n        NotificationCenter.default.removeObserver(self, name: UIApplication.didBecomeActiveNotification, object: nil)\n    }\n    \n    private var autostart: Bool { set { self.view.autostart = newValue } get { return self.view.autostart }}\n    private var autohide: Bool { set { self.view.autohide = newValue } get { return self.view.autohide }}\n    private var animation: String { set { self.view.animation = newValue } get { return self.view.animation }}\n    private var force: CGFloat { set { self.view.force = newValue } get { return self.view.force }}\n    private var delay: CGFloat { set { self.view.delay = newValue } get { return self.view.delay }}\n    private var duration: CGFloat { set { self.view.duration = newValue } get { return self.view.duration }}\n    private var damping: CGFloat { set { self.view.damping = newValue } get { return self.view.damping }}\n    private var velocity: CGFloat { set { self.view.velocity = newValue } get { return self.view.velocity }}\n    private var repeatCount: Float { set { self.view.repeatCount = newValue } get { return self.view.repeatCount }}\n    private var x: CGFloat { set { self.view.x = newValue } get { return self.view.x }}\n    private var y: CGFloat { set { self.view.y = newValue } get { return self.view.y }}\n    private var scaleX: CGFloat { set { self.view.scaleX = newValue } get { return self.view.scaleX }}\n    private var scaleY: CGFloat { set { self.view.scaleY = newValue } get { return self.view.scaleY }}\n    private var rotate: CGFloat { set { self.view.rotate = newValue } get { return self.view.rotate }}\n    private var opacity: CGFloat { set { self.view.opacity = newValue } get { return self.view.opacity }}\n    private var animateFrom: Bool { set { self.view.animateFrom = newValue } get { return self.view.animateFrom }}\n    private var curve: String { set { self.view.curve = newValue } get { return self.view.curve }}\n    \n    // UIView\n    private var layer : CALayer { return view.layer }\n    private var transform : CGAffineTransform { get { return view.transform } set { view.transform = newValue }}\n    private var alpha: CGFloat { get { return view.alpha } set { view.alpha = newValue } }\n    \n    public enum AnimationPreset: String {\n        case SlideLeft = \"slideLeft\"\n        case SlideRight = \"slideRight\"\n        case SlideDown = \"slideDown\"\n        case SlideUp = \"slideUp\"\n        case SqueezeLeft = \"squeezeLeft\"\n        case SqueezeRight = \"squeezeRight\"\n        case SqueezeDown = \"squeezeDown\"\n        case SqueezeUp = \"squeezeUp\"\n        case FadeIn = \"fadeIn\"\n        case FadeOut = \"fadeOut\"\n        case FadeOutIn = \"fadeOutIn\"\n        case FadeInLeft = \"fadeInLeft\"\n        case FadeInRight = \"fadeInRight\"\n        case FadeInDown = \"fadeInDown\"\n        case FadeInUp = \"fadeInUp\"\n        case ZoomIn = \"zoomIn\"\n        case ZoomOut = \"zoomOut\"\n        case Fall = \"fall\"\n        case Shake = \"shake\"\n        case Pop = \"pop\"\n        case FlipX = \"flipX\"\n        case FlipY = \"flipY\"\n        case Morph = \"morph\"\n        case Squeeze = \"squeeze\"\n        case Flash = \"flash\"\n        case Wobble = \"wobble\"\n        case Swing = \"swing\"\n    }\n    \n    public enum AnimationCurve: String {\n        case EaseIn = \"easeIn\"\n        case EaseOut = \"easeOut\"\n        case EaseInOut = \"easeInOut\"\n        case Linear = \"linear\"\n        case Spring = \"spring\"\n        case EaseInSine = \"easeInSine\"\n        case EaseOutSine = \"easeOutSine\"\n        case EaseInOutSine = \"easeInOutSine\"\n        case EaseInQuad = \"easeInQuad\"\n        case EaseOutQuad = \"easeOutQuad\"\n        case EaseInOutQuad = \"easeInOutQuad\"\n        case EaseInCubic = \"easeInCubic\"\n        case EaseOutCubic = \"easeOutCubic\"\n        case EaseInOutCubic = \"easeInOutCubic\"\n        case EaseInQuart = \"easeInQuart\"\n        case EaseOutQuart = \"easeOutQuart\"\n        case EaseInOutQuart = \"easeInOutQuart\"\n        case EaseInQuint = \"easeInQuint\"\n        case EaseOutQuint = \"easeOutQuint\"\n        case EaseInOutQuint = \"easeInOutQuint\"\n        case EaseInExpo = \"easeInExpo\"\n        case EaseOutExpo = \"easeOutExpo\"\n        case EaseInOutExpo = \"easeInOutExpo\"\n        case EaseInCirc = \"easeInCirc\"\n        case EaseOutCirc = \"easeOutCirc\"\n        case EaseInOutCirc = \"easeInOutCirc\"\n        case EaseInBack = \"easeInBack\"\n        case EaseOutBack = \"easeOutBack\"\n        case EaseInOutBack = \"easeInOutBack\"\n    }\n    \n    func animatePreset() {\n        alpha = 0.99\n        if let animation = AnimationPreset(rawValue: animation) {\n            switch animation {\n            case .SlideLeft:\n                x = 300*force\n            case .SlideRight:\n                x = -300*force\n            case .SlideDown:\n                y = -300*force\n            case .SlideUp:\n                y = 300*force\n            case .SqueezeLeft:\n                x = 300\n                scaleX = 3*force\n            case .SqueezeRight:\n                x = -300\n                scaleX = 3*force\n            case .SqueezeDown:\n                y = -300\n                scaleY = 3*force\n            case .SqueezeUp:\n                y = 300\n                scaleY = 3*force\n            case .FadeIn:\n                opacity = 0\n            case .FadeOut:\n                animateFrom = false\n                opacity = 0\n            case .FadeOutIn:\n                let animation = CABasicAnimation()\n                animation.keyPath = \"opacity\"\n                animation.fromValue = 1\n                animation.toValue = 0\n                animation.timingFunction = getTimingFunction(curve: curve)\n                animation.duration = CFTimeInterval(duration)\n                animation.beginTime = CACurrentMediaTime() + CFTimeInterval(delay)\n                animation.autoreverses = true\n                layer.add(animation, forKey: \"fade\")\n            case .FadeInLeft:\n                opacity = 0\n                x = 300*force\n            case .FadeInRight:\n                x = -300*force\n                opacity = 0\n            case .FadeInDown:\n                y = -300*force\n                opacity = 0\n            case .FadeInUp:\n                y = 300*force\n                opacity = 0\n            case .ZoomIn:\n                opacity = 0\n                scaleX = 2*force\n                scaleY = 2*force\n            case .ZoomOut:\n                animateFrom = false\n                opacity = 0\n                scaleX = 2*force\n                scaleY = 2*force\n            case .Fall:\n                animateFrom = false\n                rotate = 15 * CGFloat(CGFloat.pi/180)\n                y = 600*force\n            case .Shake:\n                let animation = CAKeyframeAnimation()\n                animation.keyPath = \"position.x\"\n                animation.values = [0, 30*force, -30*force, 30*force, 0]\n                animation.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1]\n                animation.timingFunction = getTimingFunction(curve: curve)\n                animation.duration = CFTimeInterval(duration)\n                animation.isAdditive = true\n                animation.repeatCount = repeatCount\n                animation.beginTime = CACurrentMediaTime() + CFTimeInterval(delay)\n                layer.add(animation, forKey: \"shake\")\n            case .Pop:\n                let animation = CAKeyframeAnimation()\n                animation.keyPath = \"transform.scale\"\n                animation.values = [0, 0.2*force, -0.2*force, 0.2*force, 0]\n                animation.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1]\n                animation.timingFunction = getTimingFunction(curve: curve)\n                animation.duration = CFTimeInterval(duration)\n                animation.isAdditive = true\n                animation.repeatCount = repeatCount\n                animation.beginTime = CACurrentMediaTime() + CFTimeInterval(delay)\n                layer.add(animation, forKey: \"pop\")\n            case .FlipX:\n                rotate = 0\n                scaleX = 1\n                scaleY = 1\n                var perspective = CATransform3DIdentity\n                perspective.m34 = -1.0 / layer.frame.size.width/2\n                \n                let animation = CABasicAnimation()\n                animation.keyPath = \"transform\"\n                animation.fromValue = NSValue(caTransform3D: CATransform3DMakeRotation(0, 0, 0, 0))\n                animation.toValue = NSValue(caTransform3D:\n                    CATransform3DConcat(perspective, CATransform3DMakeRotation(CGFloat(CGFloat.pi), 0, 1, 0)))\n                animation.duration = CFTimeInterval(duration)\n                animation.repeatCount = repeatCount\n                animation.beginTime = CACurrentMediaTime() + CFTimeInterval(delay)\n                animation.timingFunction = getTimingFunction(curve: curve)\n                layer.add(animation, forKey: \"3d\")\n            case .FlipY:\n                var perspective = CATransform3DIdentity\n                perspective.m34 = -1.0 / layer.frame.size.width/2\n                \n                let animation = CABasicAnimation()\n                animation.keyPath = \"transform\"\n                animation.fromValue = NSValue(caTransform3D:\n                    CATransform3DMakeRotation(0, 0, 0, 0))\n                animation.toValue = NSValue(caTransform3D:\n                    CATransform3DConcat(perspective,CATransform3DMakeRotation(CGFloat(CGFloat.pi), 1, 0, 0)))\n                animation.duration = CFTimeInterval(duration)\n                animation.repeatCount = repeatCount\n                animation.beginTime = CACurrentMediaTime() + CFTimeInterval(delay)\n                animation.timingFunction = getTimingFunction(curve: curve)\n                layer.add(animation, forKey: \"3d\")\n            case .Morph:\n                let morphX = CAKeyframeAnimation()\n                morphX.keyPath = \"transform.scale.x\"\n                morphX.values = [1, 1.3*force, 0.7, 1.3*force, 1]\n                morphX.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1]\n                morphX.timingFunction = getTimingFunction(curve: curve)\n                morphX.duration = CFTimeInterval(duration)\n                morphX.repeatCount = repeatCount\n                morphX.beginTime = CACurrentMediaTime() + CFTimeInterval(delay)\n                layer.add(morphX, forKey: \"morphX\")\n                \n                let morphY = CAKeyframeAnimation()\n                morphY.keyPath = \"transform.scale.y\"\n                morphY.values = [1, 0.7, 1.3*force, 0.7, 1]\n                morphY.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1]\n                morphY.timingFunction = getTimingFunction(curve: curve)\n                morphY.duration = CFTimeInterval(duration)\n                morphY.repeatCount = repeatCount\n                morphY.beginTime = CACurrentMediaTime() + CFTimeInterval(delay)\n                layer.add(morphY, forKey: \"morphY\")\n            case .Squeeze:\n                let morphX = CAKeyframeAnimation()\n                morphX.keyPath = \"transform.scale.x\"\n                morphX.values = [1, 1.5*force, 0.5, 1.5*force, 1]\n                morphX.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1]\n                morphX.timingFunction = getTimingFunction(curve: curve)\n                morphX.duration = CFTimeInterval(duration)\n                morphX.repeatCount = repeatCount\n                morphX.beginTime = CACurrentMediaTime() + CFTimeInterval(delay)\n                layer.add(morphX, forKey: \"morphX\")\n                \n                let morphY = CAKeyframeAnimation()\n                morphY.keyPath = \"transform.scale.y\"\n                morphY.values = [1, 0.5, 1, 0.5, 1]\n                morphY.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1]\n                morphY.timingFunction = getTimingFunction(curve: curve)\n                morphY.duration = CFTimeInterval(duration)\n                morphY.repeatCount = repeatCount\n                morphY.beginTime = CACurrentMediaTime() + CFTimeInterval(delay)\n                layer.add(morphY, forKey: \"morphY\")\n            case .Flash:\n                let animation = CABasicAnimation()\n                animation.keyPath = \"opacity\"\n                animation.fromValue = 1\n                animation.toValue = 0\n                animation.duration = CFTimeInterval(duration)\n                animation.repeatCount = repeatCount * 2.0\n                animation.autoreverses = true\n                animation.beginTime = CACurrentMediaTime() + CFTimeInterval(delay)\n                layer.add(animation, forKey: \"flash\")\n            case .Wobble:\n                let animation = CAKeyframeAnimation()\n                animation.keyPath = \"transform.rotation\"\n                animation.values = [0, 0.3*force, -0.3*force, 0.3*force, 0]\n                animation.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1]\n                animation.duration = CFTimeInterval(duration)\n                animation.isAdditive = true\n                animation.beginTime = CACurrentMediaTime() + CFTimeInterval(delay)\n                layer.add(animation, forKey: \"wobble\")\n                \n                let x = CAKeyframeAnimation()\n                x.keyPath = \"position.x\"\n                x.values = [0, 30*force, -30*force, 30*force, 0]\n                x.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1]\n                x.timingFunction = getTimingFunction(curve: curve)\n                x.duration = CFTimeInterval(duration)\n                x.isAdditive = true\n                x.repeatCount = repeatCount\n                x.beginTime = CACurrentMediaTime() + CFTimeInterval(delay)\n                layer.add(x, forKey: \"x\")\n            case .Swing:\n                let animation = CAKeyframeAnimation()\n                animation.keyPath = \"transform.rotation\"\n                animation.values = [0, 0.3*force, -0.3*force, 0.3*force, 0]\n                animation.keyTimes = [0, 0.2, 0.4, 0.6, 0.8, 1]\n                animation.duration = CFTimeInterval(duration)\n                animation.isAdditive = true\n                animation.repeatCount = repeatCount\n                animation.beginTime = CACurrentMediaTime() + CFTimeInterval(delay)\n                layer.add(animation, forKey: \"swing\")\n            }\n        }\n    }\n    \n    func getTimingFunction(curve: String) -> CAMediaTimingFunction {\n        if let curve = AnimationCurve(rawValue: curve) {\n            switch curve {\n            case .EaseIn: return CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeIn)\n            case .EaseOut: return CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeOut)\n            case .EaseInOut: return CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)\n            case .Linear: return CAMediaTimingFunction(name: CAMediaTimingFunctionName.linear)\n            case .Spring: return CAMediaTimingFunction(controlPoints: 0.5, 1.1+Float(force/3), 1, 1)\n            case .EaseInSine: return CAMediaTimingFunction(controlPoints: 0.47, 0, 0.745, 0.715)\n            case .EaseOutSine: return CAMediaTimingFunction(controlPoints: 0.39, 0.575, 0.565, 1)\n            case .EaseInOutSine: return CAMediaTimingFunction(controlPoints: 0.445, 0.05, 0.55, 0.95)\n            case .EaseInQuad: return CAMediaTimingFunction(controlPoints: 0.55, 0.085, 0.68, 0.53)\n            case .EaseOutQuad: return CAMediaTimingFunction(controlPoints: 0.25, 0.46, 0.45, 0.94)\n            case .EaseInOutQuad: return CAMediaTimingFunction(controlPoints: 0.455, 0.03, 0.515, 0.955)\n            case .EaseInCubic: return CAMediaTimingFunction(controlPoints: 0.55, 0.055, 0.675, 0.19)\n            case .EaseOutCubic: return CAMediaTimingFunction(controlPoints: 0.215, 0.61, 0.355, 1)\n            case .EaseInOutCubic: return CAMediaTimingFunction(controlPoints: 0.645, 0.045, 0.355, 1)\n            case .EaseInQuart: return CAMediaTimingFunction(controlPoints: 0.895, 0.03, 0.685, 0.22)\n            case .EaseOutQuart: return CAMediaTimingFunction(controlPoints: 0.165, 0.84, 0.44, 1)\n            case .EaseInOutQuart: return CAMediaTimingFunction(controlPoints: 0.77, 0, 0.175, 1)\n            case .EaseInQuint: return CAMediaTimingFunction(controlPoints: 0.755, 0.05, 0.855, 0.06)\n            case .EaseOutQuint: return CAMediaTimingFunction(controlPoints: 0.23, 1, 0.32, 1)\n            case .EaseInOutQuint: return CAMediaTimingFunction(controlPoints: 0.86, 0, 0.07, 1)\n            case .EaseInExpo: return CAMediaTimingFunction(controlPoints: 0.95, 0.05, 0.795, 0.035)\n            case .EaseOutExpo: return CAMediaTimingFunction(controlPoints: 0.19, 1, 0.22, 1)\n            case .EaseInOutExpo: return CAMediaTimingFunction(controlPoints: 1, 0, 0, 1)\n            case .EaseInCirc: return CAMediaTimingFunction(controlPoints: 0.6, 0.04, 0.98, 0.335)\n            case .EaseOutCirc: return CAMediaTimingFunction(controlPoints: 0.075, 0.82, 0.165, 1)\n            case .EaseInOutCirc: return CAMediaTimingFunction(controlPoints: 0.785, 0.135, 0.15, 0.86)\n            case .EaseInBack: return CAMediaTimingFunction(controlPoints: 0.6, -0.28, 0.735, 0.045)\n            case .EaseOutBack: return CAMediaTimingFunction(controlPoints: 0.175, 0.885, 0.32, 1.275)\n            case .EaseInOutBack: return CAMediaTimingFunction(controlPoints: 0.68, -0.55, 0.265, 1.55)\n            }\n        }\n        return CAMediaTimingFunction(name: CAMediaTimingFunctionName.default)\n    }\n    \n    func getAnimationOptions(curve: String) -> UIView.AnimationOptions {\n        if let curve = AnimationCurve(rawValue: curve) {\n            switch curve {\n            case .EaseIn: return UIView.AnimationOptions.curveEaseIn\n            case .EaseOut: return UIView.AnimationOptions.curveEaseOut\n            case .EaseInOut: return UIView.AnimationOptions()\n            default: break\n            }\n        }\n        return UIView.AnimationOptions.curveLinear\n    }\n    \n    public func animate() {\n        animateFrom = true\n        animatePreset()\n        setView {}\n    }\n    \n    public func animateNext(completion: @escaping () -> ()) {\n        animateFrom = true\n        animatePreset()\n        setView {\n            completion()\n        }\n    }\n    \n    public func animateTo() {\n        animateFrom = false\n        animatePreset()\n        setView {}\n    }\n    \n    public func animateToNext(completion: @escaping () -> ()) {\n        animateFrom = false\n        animatePreset()\n        setView {\n            completion()\n        }\n    }\n    \n    public func customAwakeFromNib() {\n        if autohide {\n            alpha = 0\n        }\n    }\n    \n    public func customLayoutSubviews() {\n        if shouldAnimateInLayoutSubviews {\n            shouldAnimateInLayoutSubviews = false\n            if autostart {\n                if UIApplication.shared.applicationState != .active {\n                    shouldAnimateAfterActive = true\n                    return\n                }\n                alpha = 0\n                animate()\n            }\n        }\n    }\n    \n    func setView(completion: @escaping () -> ()) {\n        if animateFrom {\n            let translate = CGAffineTransform(translationX: self.x, y: self.y)\n            let scale = CGAffineTransform(scaleX: self.scaleX, y: self.scaleY)\n            let rotate = CGAffineTransform(rotationAngle: self.rotate)\n            let translateAndScale = translate.concatenating(scale)\n            self.transform = rotate.concatenating(translateAndScale)\n            \n            self.alpha = self.opacity\n        }\n        \n        UIView.animate( withDuration: TimeInterval(duration),\n                        delay: TimeInterval(delay),\n                        usingSpringWithDamping: damping,\n                        initialSpringVelocity: velocity,\n                        options: [getAnimationOptions(curve: curve), UIView.AnimationOptions.allowUserInteraction],\n                        animations: { [weak self] in\n                            if let _self = self\n                            {\n                                if _self.animateFrom {\n                                    _self.transform = CGAffineTransform.identity\n                                    _self.alpha = 1\n                                }\n                                else {\n                                    let translate = CGAffineTransform(translationX: _self.x, y: _self.y)\n                                    let scale = CGAffineTransform(scaleX: _self.scaleX, y: _self.scaleY)\n                                    let rotate = CGAffineTransform(rotationAngle: _self.rotate)\n                                    let translateAndScale = translate.concatenating(scale)\n                                    _self.transform = rotate.concatenating(translateAndScale)\n                                    \n                                    _self.alpha = _self.opacity\n                                }\n                                \n                            }\n                            \n            }, completion: { [weak self] finished in\n                \n                completion()\n                self?.resetAll()\n                \n        })\n        \n    }\n    \n    func reset() {\n        x = 0\n        y = 0\n        opacity = 1\n    }\n    \n    func resetAll() {\n        x = 0\n        y = 0\n        animation = \"\"\n        opacity = 1\n        scaleX = 1\n        scaleY = 1\n        rotate = 0\n        damping = 0.7\n        velocity = 0.7\n        repeatCount = 1\n        delay = 0\n        duration = 0.7\n    }\n    \n}\n"
  },
  {
    "path": "Spring/SpringAnimation.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2015 Meng To (meng@designcode.io)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport UIKit\n\n@objc public class SpringAnimation: NSObject {\n    public class func spring(duration: TimeInterval, animations: @escaping () -> Void) {\n        UIView.animate(\n            withDuration: duration,\n            delay: 0,\n            usingSpringWithDamping: 0.7,\n            initialSpringVelocity: 0.7,\n            options: [],\n            animations: {\n                animations()\n            },\n            completion: nil\n        )\n    }\n\n    public class func springEaseIn(duration: TimeInterval, animations: (() -> Void)!) {\n        UIView.animate(\n            withDuration: duration,\n            delay: 0,\n            options: .curveEaseIn,\n            animations: {\n                animations()\n            },\n            completion: nil\n        )\n    }\n\n    public class func springEaseOut(duration: TimeInterval, animations: (() -> Void)!) {\n        UIView.animate(\n            withDuration: duration,\n            delay: 0,\n            options: .curveEaseOut,\n            animations: {\n                animations()\n            }, completion: nil\n        )\n    }\n\n    public class func springEaseInOut(duration: TimeInterval, animations: (() -> Void)!) {\n        UIView.animate(\n            withDuration: duration,\n            delay: 0,\n            options: UIView.AnimationOptions(),\n            animations: {\n                animations()\n            }, completion: nil\n        )\n    }\n\n    public class func springLinear(duration: TimeInterval, animations: (() -> Void)!) {\n        UIView.animate(\n            withDuration: duration,\n            delay: 0,\n            options: .curveLinear,\n            animations: {\n                animations()\n            }, completion: nil\n        )\n    }\n\n    public class func springWithDelay(duration: TimeInterval, delay: TimeInterval, animations: (() -> Void)!) {\n        UIView.animate(\n            withDuration: duration,\n            delay: delay,\n            usingSpringWithDamping: 0.7,\n            initialSpringVelocity: 0.7,\n            options: [],\n            animations: {\n                animations()\n            }, completion: nil\n        )\n    }\n\n    public class func springWithCompletion(duration: TimeInterval, animations: (() -> Void)!, completion: ((Bool) -> Void)!) {\n        UIView.animate(\n            withDuration: duration,\n            delay: 0,\n            usingSpringWithDamping: 0.7,\n            initialSpringVelocity: 0.7,\n            options: [],\n            animations: {\n                animations()\n            }, completion: { finished in\n                completion(finished)\n            }\n        )\n    }\n}\n"
  },
  {
    "path": "Spring/SpringButton.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2015 Meng To (meng@designcode.io)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport UIKit\n\nopen class SpringButton: UIButton, Springable {\n    @IBInspectable public var autostart: Bool = false\n    @IBInspectable public var autohide: Bool = false\n    @IBInspectable public var animation: String = \"\"\n    @IBInspectable public var force: CGFloat = 1\n    @IBInspectable public var delay: CGFloat = 0\n    @IBInspectable public var duration: CGFloat = 0.7\n    @IBInspectable public var damping: CGFloat = 0.7\n    @IBInspectable public var velocity: CGFloat = 0.7\n    @IBInspectable public var repeatCount: Float = 1\n    @IBInspectable public var x: CGFloat = 0\n    @IBInspectable public var y: CGFloat = 0\n    @IBInspectable public var scaleX: CGFloat = 1\n    @IBInspectable public var scaleY: CGFloat = 1\n    @IBInspectable public var rotate: CGFloat = 0\n    @IBInspectable public var curve: String = \"\"\n    public var opacity: CGFloat = 1\n    public var animateFrom: Bool = false\n\n    lazy private var spring : Spring = Spring(self)\n\n    override open func awakeFromNib() {\n        super.awakeFromNib()\n        self.spring.customAwakeFromNib()\n    }\n\n    open override func layoutSubviews() {\n        super.layoutSubviews()\n        spring.customLayoutSubviews()\n    }\n\n    public func animate() {\n        self.spring.animate()\n    }\n\n    public func animateNext(completion: @escaping () -> ()) {\n        self.spring.animateNext(completion: completion)\n    }\n\n    public func animateTo() {\n        self.spring.animateTo()\n    }\n\n    public func animateToNext(completion: @escaping () -> ()) {\n        self.spring.animateToNext(completion: completion)\n    }\n}\n"
  },
  {
    "path": "Spring/SpringImageView.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2015 Meng To (meng@designcode.io)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport UIKit\n\nopen class SpringImageView: UIImageView, Springable {\n    @IBInspectable public var autostart: Bool = false\n    @IBInspectable public var autohide: Bool = false\n    @IBInspectable public var animation: String = \"\"\n    @IBInspectable public var force: CGFloat = 1\n    @IBInspectable public var delay: CGFloat = 0\n    @IBInspectable public var duration: CGFloat = 0.7\n    @IBInspectable public var damping: CGFloat = 0.7\n    @IBInspectable public var velocity: CGFloat = 0.7\n    @IBInspectable public var repeatCount: Float = 1\n    @IBInspectable public var x: CGFloat = 0\n    @IBInspectable public var y: CGFloat = 0\n    @IBInspectable public var scaleX: CGFloat = 1\n    @IBInspectable public var scaleY: CGFloat = 1\n    @IBInspectable public var rotate: CGFloat = 0\n    @IBInspectable public var curve: String = \"\"\n    public var opacity: CGFloat = 1\n    public var animateFrom: Bool = false\n\n    lazy private var spring : Spring = Spring(self)\n\n    override open func awakeFromNib() {\n        super.awakeFromNib()\n        self.spring.customAwakeFromNib()\n    }\n\n    open override func layoutSubviews() {\n        super.layoutSubviews()\n        spring.customLayoutSubviews()\n    }\n\n    public func animate() {\n        self.spring.animate()\n    }\n\n    public func animateNext(completion: @escaping () -> ()) {\n        self.spring.animateNext(completion: completion)\n    }\n\n    public func animateTo() {\n        self.spring.animateTo()\n    }\n\n    public func animateToNext(completion: @escaping () -> ()) {\n        self.spring.animateToNext(completion: completion)\n    }\n\n}\n"
  },
  {
    "path": "Spring/SpringLabel.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2015 Meng To (meng@designcode.io)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport UIKit\n\nopen class SpringLabel: UILabel, Springable {\n    @IBInspectable public var autostart: Bool = false\n    @IBInspectable public var autohide: Bool = false\n    @IBInspectable public var animation: String = \"\"\n    @IBInspectable public var force: CGFloat = 1\n    @IBInspectable public var delay: CGFloat = 0\n    @IBInspectable public var duration: CGFloat = 0.7\n    @IBInspectable public var damping: CGFloat = 0.7\n    @IBInspectable public var velocity: CGFloat = 0.7\n    @IBInspectable public var repeatCount: Float = 1\n    @IBInspectable public var x: CGFloat = 0\n    @IBInspectable public var y: CGFloat = 0\n    @IBInspectable public var scaleX: CGFloat = 1\n    @IBInspectable public var scaleY: CGFloat = 1\n    @IBInspectable public var rotate: CGFloat = 0\n    @IBInspectable public var curve: String = \"\"\n    public var opacity: CGFloat = 1\n    public var animateFrom: Bool = false\n\n    lazy private var spring : Spring = Spring(self)\n\n    override open func awakeFromNib() {\n        super.awakeFromNib()\n        self.spring.customAwakeFromNib()\n    }\n\n    open override func layoutSubviews() {\n        super.layoutSubviews()\n        spring.customLayoutSubviews()\n    }\n\n    public func animate() {\n        self.spring.animate()\n    }\n\n    public func animateNext(completion: @escaping () -> ()) {\n        self.spring.animateNext(completion: completion)\n    }\n\n    public func animateTo() {\n        self.spring.animateTo()\n    }\n\n    public func animateToNext(completion: @escaping () -> ()) {\n        self.spring.animateToNext(completion: completion)\n    }\n\n}\n"
  },
  {
    "path": "Spring/SpringTextField.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2015 Meng To (meng@designcode.io)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport UIKit\n\nopen class SpringTextField: UITextField, Springable {\n    @IBInspectable public var autostart: Bool = false\n    @IBInspectable public var autohide: Bool = false\n    @IBInspectable public var animation: String = \"\"\n    @IBInspectable public var force: CGFloat = 1\n    @IBInspectable public var delay: CGFloat = 0\n    @IBInspectable public var duration: CGFloat = 0.7\n    @IBInspectable public var damping: CGFloat = 0.7\n    @IBInspectable public var velocity: CGFloat = 0.7\n    @IBInspectable public var repeatCount: Float = 1\n    @IBInspectable public var x: CGFloat = 0\n    @IBInspectable public var y: CGFloat = 0\n    @IBInspectable public var scaleX: CGFloat = 1\n    @IBInspectable public var scaleY: CGFloat = 1\n    @IBInspectable public var rotate: CGFloat = 0\n    @IBInspectable public var curve: String = \"\"\n    public var opacity: CGFloat = 1\n    public var animateFrom: Bool = false\n\n    lazy private var spring : Spring = Spring(self)\n\n    override open func awakeFromNib() {\n        super.awakeFromNib()\n        self.spring.customAwakeFromNib()\n    }\n\n    open override func layoutSubviews() {\n        super.layoutSubviews()\n        spring.customLayoutSubviews()\n    }\n\n    public func animate() {\n        self.spring.animate()\n    }\n\n    public func animateNext(completion: @escaping () -> ()) {\n        self.spring.animateNext(completion: completion)\n    }\n\n    public func animateTo() {\n        self.spring.animateTo()\n    }\n\n    public func animateToNext(completion: @escaping () -> ()) {\n        self.spring.animateToNext(completion: completion)\n    }\n}\n"
  },
  {
    "path": "Spring/SpringTextView.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2015 Meng To (meng@designcode.io)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport UIKit\n\nopen class SpringTextView: UITextView, Springable {\n    @IBInspectable public var autostart: Bool = false\n    @IBInspectable public var autohide: Bool = false\n    @IBInspectable public var animation: String = \"\"\n    @IBInspectable public var force: CGFloat = 1\n    @IBInspectable public var delay: CGFloat = 0\n    @IBInspectable public var duration: CGFloat = 0.7\n    @IBInspectable public var damping: CGFloat = 0.7\n    @IBInspectable public var velocity: CGFloat = 0.7\n    @IBInspectable public var repeatCount: Float = 1\n    @IBInspectable public var x: CGFloat = 0\n    @IBInspectable public var y: CGFloat = 0\n    @IBInspectable public var scaleX: CGFloat = 1\n    @IBInspectable public var scaleY: CGFloat = 1\n    @IBInspectable public var rotate: CGFloat = 0\n    @IBInspectable public var curve: String = \"\"\n    public var opacity: CGFloat = 1\n    public var animateFrom: Bool = false\n\n    lazy private var spring : Spring = Spring(self)\n\n    override open func awakeFromNib() {\n        super.awakeFromNib()\n        self.spring.customAwakeFromNib()\n    }\n\n    open override func layoutSubviews() {\n        super.layoutSubviews()\n        spring.customLayoutSubviews()\n    }\n\n    public func animate() {\n        self.spring.animate()\n    }\n\n    public func animateNext(completion: @escaping () -> ()) {\n        self.spring.animateNext(completion: completion)\n    }\n\n    public func animateTo() {\n        self.spring.animateTo()\n    }\n\n    public func animateToNext(completion: @escaping () -> ()) {\n        self.spring.animateToNext(completion: completion)\n    }\n\n}\n"
  },
  {
    "path": "Spring/SpringView.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2015 Meng To (meng@designcode.io)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport UIKit\n\nopen class SpringView: UIView, Springable {\n    @IBInspectable public var autostart: Bool = false\n    @IBInspectable public var autohide: Bool = false\n    @IBInspectable public var animation: String = \"\"\n    @IBInspectable public var force: CGFloat = 1\n    @IBInspectable public var delay: CGFloat = 0\n    @IBInspectable public var duration: CGFloat = 0.7\n    @IBInspectable public var damping: CGFloat = 0.7\n    @IBInspectable public var velocity: CGFloat = 0.7\n    @IBInspectable public var repeatCount: Float = 1\n    @IBInspectable public var x: CGFloat = 0\n    @IBInspectable public var y: CGFloat = 0\n    @IBInspectable public var scaleX: CGFloat = 1\n    @IBInspectable public var scaleY: CGFloat = 1\n    @IBInspectable public var rotate: CGFloat = 0\n    @IBInspectable public var curve: String = \"\"\n    public var opacity: CGFloat = 1\n    public var animateFrom: Bool = false\n\n    lazy private var spring : Spring = Spring(self)\n\n    override open func awakeFromNib() {\n        super.awakeFromNib()\n        self.spring.customAwakeFromNib()\n    }\n\n    open override func layoutSubviews() {\n        super.layoutSubviews()\n        spring.customLayoutSubviews()\n    }\n    \n    public func animate() {\n        self.spring.animate()\n    }\n\n    public func animateNext(completion: @escaping () -> ()) {\n        self.spring.animateNext(completion: completion)\n    }\n\n    public func animateTo() {\n        self.spring.animateTo()\n    }\n\n    public func animateToNext(completion: @escaping () -> ()) {\n        self.spring.animateToNext(completion: completion)\n    }\n}\n"
  },
  {
    "path": "Spring/TransitionManager.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2015 Meng To (meng@designcode.io)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport UIKit\n\npublic class TransitionManager: NSObject, UIViewControllerTransitioningDelegate, UIViewControllerAnimatedTransitioning {\n    \n    var isPresenting = true\n    var duration = 0.3\n    \n    public func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {\n        let container = transitionContext.containerView\n        let fromView = transitionContext.view(forKey: UITransitionContextViewKey.from)!\n        let toView = transitionContext.view(forKey: UITransitionContextViewKey.to)!\n        \n        if isPresenting {\n            toView.frame = container.bounds\n            toView.transform = CGAffineTransform(translationX: 0, y: container.frame.size.height)\n            container.addSubview(fromView)\n            container.addSubview(toView)\n            SpringAnimation.springEaseInOut(duration: duration) {\n                fromView.transform = CGAffineTransform(scaleX: 0.8, y: 0.8)\n                fromView.alpha = 0.5\n                toView.transform = CGAffineTransform.identity\n            }\n        }\n        else {\n\n            // 1. Rotating will change the bounds\n            // 2. we have to properly reset toView\n            // to the actual container's bounds, at\n            // the same time take consideration of\n            // previous transformation when presenting\n            let transform = toView.transform\n            toView.transform = CGAffineTransform.identity\n            toView.frame = container.bounds\n            toView.transform = transform\n\n            container.addSubview(toView)\n            container.addSubview(fromView)\n\n            SpringAnimation.springEaseInOut(duration: duration) {\n                fromView.transform = CGAffineTransform(translationX: 0, y: fromView.frame.size.height)\n                toView.transform = CGAffineTransform.identity\n                toView.alpha = 1\n            }\n        }\n        \n        delay(delay: duration, closure: {\n            transitionContext.completeTransition(true)\n        })\n    }\n    \n    public func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {\n        return duration\n    }\n    \n    public func animationController(forPresentedController presented: UIViewController, presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? {\n        isPresenting = true\n        return self\n    }\n    \n    public func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {\n        isPresenting = false\n        return self\n    }\n}\n"
  },
  {
    "path": "Spring/TransitionZoom.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2015 Meng To (meng@designcode.io)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport UIKit\n\npublic class TransitionZoom: NSObject, UIViewControllerTransitioningDelegate, UIViewControllerAnimatedTransitioning {\n    \n    var isPresenting = true\n    var duration = 0.4\n    \n    public func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {\n        let container = transitionContext.containerView\n        let fromView = transitionContext.view(forKey: UITransitionContextViewKey.from)!\n        let toView = transitionContext.view(forKey: UITransitionContextViewKey.to)!\n        \n        if isPresenting {\n            container.addSubview(fromView)\n            container.addSubview(toView)\n            \n            toView.alpha = 0\n            toView.transform = CGAffineTransform(scaleX: 2, y: 2)\n\n            SpringAnimation.springEaseInOut(duration: duration) {\n                fromView.transform = CGAffineTransform(scaleX: 0.5, y: 0.5)\n                fromView.alpha = 0\n                toView.transform = CGAffineTransform.identity\n                toView.alpha = 1\n            }\n        }\n        else {\n            container.addSubview(toView)\n            container.addSubview(fromView)\n            \n            SpringAnimation.springEaseInOut(duration: duration) {\n                fromView.transform = CGAffineTransform(scaleX: 2, y: 2)\n                fromView.alpha = 0\n                toView.transform = CGAffineTransform(scaleX: 1, y: 1)\n                toView.alpha = 1\n            }\n        }\n        \n        delay(delay: duration, closure: {\n            transitionContext.completeTransition(true)\n        })\n    }\n    \n    public func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {\n        return duration\n    }\n    \n    public func animationController(forPresentedController presented: UIViewController, presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? {\n        isPresenting = true\n        return self\n    }\n    \n    public func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {\n        isPresenting = false\n        return self\n    }\n}\n"
  },
  {
    "path": "Spring/UnwindSegue.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2015 Meng To (meng@designcode.io)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport UIKit\n\npublic extension UIViewController {\n    @IBAction public func unwindToViewController (_ segue: UIStoryboardSegue){}\n}\n"
  },
  {
    "path": "Spring.podspec",
    "content": "Pod::Spec.new do |s|\n  s.name = 'Spring'\n  s.version = '1.0.6'\n  s.license = 'MIT'\n  s.summary = 'A library to simplify iOS animations in Swift.'\n  s.homepage = 'https://github.com/MengTo/Spring'\n  s.authors = { 'Meng To' => 'meng@designcode.io' }\n  s.source = { :git => 'https://github.com/MengTo/Spring.git', :tag => s.version.to_s }\n  s.requires_arc = true\n  s.ios.deployment_target = '8.0'\n  s.tvos.deployment_target = '11.0'\n  s.source_files = 'Spring/*.swift'\n  s.ios.resources = ['Spring/*.xib', 'SpringApp/*.xcassets']\n  s.tvos.resources = ['SpringApp/*.xcassets']\nend\n"
  },
  {
    "path": "SpringApp/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  SpringApp\n//\n//  Created by Meng To on 2015-01-06.\n//  Copyright (c) 2015 Meng To. All rights reserved.\n//\n\nimport UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n    var window: UIWindow?\n\n\n    func applicationDidFinishLaunching(_ application: UIApplication) {\n        // Override point for customization after application launch.\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": "SpringApp/Base.lproj/LaunchScreen.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"11173.2\" systemVersion=\"15G31\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"11173.2\"/>\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=\"UpM-yt-Mha\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"HyS-sC-NOj\">\n                    <color key=\"backgroundColor\" red=\"0.92941176469999998\" green=\"0.94509803920000002\" blue=\"0.96078431369999995\" alpha=\"0.5\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                    <constraints>\n                        <constraint firstAttribute=\"height\" constant=\"260\" id=\"ZzL-k1-Chw\"/>\n                    </constraints>\n                </view>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"t7P-Rw-nWV\">\n                    <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                </view>\n            </subviews>\n            <color key=\"backgroundColor\" cocoaTouchSystemColor=\"tableCellGroupedBackgroundColor\"/>\n            <constraints>\n                <constraint firstItem=\"t7P-Rw-nWV\" firstAttribute=\"leading\" secondItem=\"UpM-yt-Mha\" secondAttribute=\"leading\" id=\"7kg-00-bKX\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"t7P-Rw-nWV\" secondAttribute=\"trailing\" id=\"D2z-sY-gsJ\"/>\n                <constraint firstItem=\"HyS-sC-NOj\" firstAttribute=\"top\" secondItem=\"t7P-Rw-nWV\" secondAttribute=\"bottom\" id=\"M41-Bz-daQ\"/>\n                <constraint firstItem=\"HyS-sC-NOj\" firstAttribute=\"leading\" secondItem=\"UpM-yt-Mha\" secondAttribute=\"leading\" id=\"OyT-BU-HGL\"/>\n                <constraint firstItem=\"t7P-Rw-nWV\" firstAttribute=\"top\" secondItem=\"UpM-yt-Mha\" secondAttribute=\"top\" id=\"RbV-ub-MW2\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"HyS-sC-NOj\" secondAttribute=\"trailing\" id=\"dPv-Rb-3j2\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"HyS-sC-NOj\" secondAttribute=\"bottom\" id=\"un2-ep-uEa\"/>\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": "SpringApp/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=\"11201\" systemVersion=\"16A323\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\" initialViewController=\"uF9-EU-g6i\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"11161\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <customFonts key=\"customFonts\">\n        <array key=\"AvenirNext.ttc\">\n            <string>AvenirNext-DemiBold</string>\n            <string>AvenirNext-Regular</string>\n        </array>\n    </customFonts>\n    <scenes>\n        <!--Spring View Controller-->\n        <scene sceneID=\"BLg-45-6qz\">\n            <objects>\n                <viewController id=\"uF9-EU-g6i\" customClass=\"SpringViewController\" customModule=\"SpringApp\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"sBl-ke-ld6\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"9I4-Bi-XrU\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"PVY-HA-UuV\">\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                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"jEx-iK-Wpm\">\n                                <subviews>\n                                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"pm9-y7-HlR\" customClass=\"SpringView\" customModule=\"Spring\">\n                                        <color key=\"backgroundColor\" red=\"0.1529411765\" green=\"0.61176470589999998\" blue=\"0.92156862750000001\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" constant=\"100\" id=\"gmq-7q-DaV\"/>\n                                            <constraint firstAttribute=\"height\" constant=\"100\" id=\"v07-I1-obA\"/>\n                                        </constraints>\n                                        <userDefinedRuntimeAttributes>\n                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"layer.cornerRadius\">\n                                                <integer key=\"value\" value=\"10\"/>\n                                            </userDefinedRuntimeAttribute>\n                                            <userDefinedRuntimeAttribute type=\"string\" keyPath=\"animation\" value=\"shake\"/>\n                                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"animateFrom\" value=\"YES\"/>\n                                        </userDefinedRuntimeAttributes>\n                                    </view>\n                                    <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kW9-eS-V9V\">\n                                        <color key=\"backgroundColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <state key=\"normal\">\n                                            <color key=\"titleShadowColor\" red=\"0.5\" green=\"0.5\" blue=\"0.5\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        </state>\n                                        <connections>\n                                            <action selector=\"ballButtonPressed:\" destination=\"uF9-EU-g6i\" eventType=\"touchUpInside\" id=\"dwB-lg-MWn\"/>\n                                        </connections>\n                                    </button>\n                                    <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"hQw-No-MzG\">\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" constant=\"100\" id=\"bV4-jl-2ic\"/>\n                                            <constraint firstAttribute=\"height\" constant=\"44\" id=\"z4W-XA-EwU\"/>\n                                        </constraints>\n                                        <fontDescription key=\"fontDescription\" name=\"AvenirNext-Regular\" family=\"Avenir Next\" pointSize=\"20\"/>\n                                        <color key=\"tintColor\" red=\"0.1529411765\" green=\"0.61176470589999998\" blue=\"0.92156862750000001\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <state key=\"normal\" title=\"Options\">\n                                            <color key=\"titleShadowColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        </state>\n                                        <connections>\n                                            <segue destination=\"TLI-qL-rpM\" kind=\"presentation\" animates=\"NO\" modalPresentationStyle=\"overCurrentContext\" id=\"gkI-YH-5O4\"/>\n                                        </connections>\n                                    </button>\n                                    <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"XZL-Vb-0wq\">\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"44\" id=\"76m-Hg-JIu\"/>\n                                            <constraint firstAttribute=\"height\" constant=\"44\" id=\"8jj-4J-qlA\"/>\n                                            <constraint firstAttribute=\"width\" constant=\"100\" id=\"SeB-ve-Lhd\"/>\n                                            <constraint firstAttribute=\"width\" constant=\"100\" id=\"ui4-JW-eAd\"/>\n                                        </constraints>\n                                        <fontDescription key=\"fontDescription\" name=\"AvenirNext-Regular\" family=\"Avenir Next\" pointSize=\"20\"/>\n                                        <color key=\"tintColor\" red=\"0.1529411765\" green=\"0.61176470589999998\" blue=\"0.92156862750000001\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <state key=\"normal\" title=\"Code\">\n                                            <color key=\"titleShadowColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        </state>\n                                        <variation key=\"default\">\n                                            <mask key=\"constraints\">\n                                                <exclude reference=\"76m-Hg-JIu\"/>\n                                                <exclude reference=\"ui4-JW-eAd\"/>\n                                            </mask>\n                                        </variation>\n                                        <connections>\n                                            <segue destination=\"gI9-MU-NP6\" kind=\"presentation\" animates=\"NO\" modalPresentationStyle=\"overCurrentContext\" id=\"FuN-YA-SEn\"/>\n                                        </connections>\n                                    </button>\n                                    <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Nak-D3-XzB\">\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"44\" id=\"6uK-hP-N9l\"/>\n                                            <constraint firstAttribute=\"width\" constant=\"100\" id=\"yhA-dX-cdB\"/>\n                                        </constraints>\n                                        <color key=\"tintColor\" red=\"0.1529411765\" green=\"0.61176470589999998\" blue=\"0.92156862750000001\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <state key=\"normal\" image=\"icon-shape\"/>\n                                        <connections>\n                                            <action selector=\"shapeButtonPressed:\" destination=\"uF9-EU-g6i\" eventType=\"touchUpInside\" id=\"H2Y-y2-Jgx\"/>\n                                        </connections>\n                                    </button>\n                                </subviews>\n                                <color key=\"backgroundColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"bottom\" secondItem=\"kW9-eS-V9V\" secondAttribute=\"bottom\" id=\"6uT-yo-OAF\"/>\n                                    <constraint firstAttribute=\"centerX\" secondItem=\"pm9-y7-HlR\" secondAttribute=\"centerX\" id=\"7hO-9B-uxH\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"kW9-eS-V9V\" secondAttribute=\"trailing\" id=\"DER-GK-DCU\"/>\n                                    <constraint firstAttribute=\"centerY\" secondItem=\"pm9-y7-HlR\" secondAttribute=\"centerY\" id=\"EuU-FB-fE7\"/>\n                                    <constraint firstItem=\"hQw-No-MzG\" firstAttribute=\"leading\" secondItem=\"Nak-D3-XzB\" secondAttribute=\"trailing\" id=\"GK9-2Y-Mc1\"/>\n                                    <constraint firstItem=\"kW9-eS-V9V\" firstAttribute=\"leading\" secondItem=\"jEx-iK-Wpm\" secondAttribute=\"leading\" id=\"Go6-NB-BBU\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"hQw-No-MzG\" secondAttribute=\"trailing\" id=\"Gya-jY-yaA\"/>\n                                    <constraint firstItem=\"XZL-Vb-0wq\" firstAttribute=\"top\" secondItem=\"jEx-iK-Wpm\" secondAttribute=\"top\" constant=\"20\" id=\"Nuc-Gf-M1Y\"/>\n                                    <constraint firstItem=\"kW9-eS-V9V\" firstAttribute=\"top\" secondItem=\"jEx-iK-Wpm\" secondAttribute=\"top\" id=\"UFX-jh-H2F\"/>\n                                    <constraint firstAttribute=\"bottom\" secondItem=\"hQw-No-MzG\" secondAttribute=\"bottom\" constant=\"10\" id=\"bR8-aE-oYG\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"XZL-Vb-0wq\" secondAttribute=\"trailing\" constant=\"15\" id=\"h32-ZG-FIX\"/>\n                                    <constraint firstAttribute=\"bottom\" secondItem=\"XZL-Vb-0wq\" secondAttribute=\"bottom\" constant=\"10\" id=\"imJ-3U-hM9\"/>\n                                    <constraint firstItem=\"XZL-Vb-0wq\" firstAttribute=\"leading\" secondItem=\"jEx-iK-Wpm\" secondAttribute=\"leading\" id=\"nLI-BM-55T\"/>\n                                    <constraint firstAttribute=\"bottom\" secondItem=\"Nak-D3-XzB\" secondAttribute=\"bottom\" constant=\"10\" id=\"p1y-0S-Mf1\"/>\n                                    <constraint firstAttribute=\"centerX\" secondItem=\"Nak-D3-XzB\" secondAttribute=\"centerX\" id=\"rRq-q4-xqB\">\n                                        <variation key=\"heightClass=compact-widthClass=regular\" constant=\"-250\"/>\n                                    </constraint>\n                                </constraints>\n                                <variation key=\"default\">\n                                    <mask key=\"constraints\">\n                                        <exclude reference=\"Nuc-Gf-M1Y\"/>\n                                        <exclude reference=\"h32-ZG-FIX\"/>\n                                        <exclude reference=\"GK9-2Y-Mc1\"/>\n                                    </mask>\n                                </variation>\n                                <variation key=\"heightClass=compact-widthClass=regular\">\n                                    <mask key=\"constraints\">\n                                        <exclude reference=\"rRq-q4-xqB\"/>\n                                        <include reference=\"GK9-2Y-Mc1\"/>\n                                    </mask>\n                                </variation>\n                            </view>\n                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Mpa-80-hgk\">\n                                <subviews>\n                                    <pickerView contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"afX-4m-2dp\"/>\n                                    <slider opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" value=\"1\" minValue=\"1\" maxValue=\"5\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Vkq-iS-03i\">\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" constant=\"86\" id=\"f1W-Wg-bij\"/>\n                                            <constraint firstAttribute=\"height\" constant=\"30\" id=\"kQO-qr-wGX\"/>\n                                        </constraints>\n                                        <color key=\"minimumTrackTintColor\" red=\"0.1529411765\" green=\"0.61176470589999998\" blue=\"0.92156862750000001\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <color key=\"maximumTrackTintColor\" red=\"0.51576060056686401\" green=\"0.54782974720001221\" blue=\"0.62907493114471436\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <connections>\n                                            <action selector=\"forceSliderChanged:\" destination=\"uF9-EU-g6i\" eventType=\"valueChanged\" id=\"sex-e8-E9L\"/>\n                                        </connections>\n                                    </slider>\n                                    <slider opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" value=\"1\" minValue=\"0.5\" maxValue=\"5\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"AkI-y0-NKD\">\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" constant=\"86\" id=\"7nQ-OH-2r6\"/>\n                                        </constraints>\n                                        <color key=\"minimumTrackTintColor\" red=\"0.1529411765\" green=\"0.61176470589999998\" blue=\"0.92156862750000001\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <color key=\"maximumTrackTintColor\" red=\"0.51576060056686401\" green=\"0.54782974720001221\" blue=\"0.62907493114471436\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <connections>\n                                            <action selector=\"durationSliderChanged:\" destination=\"uF9-EU-g6i\" eventType=\"valueChanged\" id=\"MIQ-6p-sqg\"/>\n                                        </connections>\n                                    </slider>\n                                    <slider opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" minValue=\"0.0\" maxValue=\"5\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8lZ-4r-F62\">\n                                        <color key=\"tintColor\" red=\"0.1529411765\" green=\"0.61176470589999998\" blue=\"0.92156862750000001\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" constant=\"86\" id=\"JnO-NC-shv\"/>\n                                            <constraint firstAttribute=\"height\" constant=\"30\" id=\"PyR-VU-Abr\"/>\n                                        </constraints>\n                                        <color key=\"minimumTrackTintColor\" red=\"0.1529411765\" green=\"0.61176470589999998\" blue=\"0.92156862750000001\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <color key=\"maximumTrackTintColor\" red=\"0.51576060056686401\" green=\"0.54782974720001221\" blue=\"0.62907493114471436\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <connections>\n                                            <action selector=\"delaySliderChanged:\" destination=\"uF9-EU-g6i\" eventType=\"valueChanged\" id=\"pAg-L8-Z7q\"/>\n                                        </connections>\n                                    </slider>\n                                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Force: 1\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"hZO-3H-UCU\">\n                                        <fontDescription key=\"fontDescription\" name=\"Avenir-Heavy\" family=\"Avenir\" pointSize=\"12\"/>\n                                        <color key=\"textColor\" red=\"0.51576060056686401\" green=\"0.54782974720001221\" blue=\"0.62907493114471436\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Duration: 1\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"xk2-sC-g25\">\n                                        <fontDescription key=\"fontDescription\" name=\"Avenir-Heavy\" family=\"Avenir\" pointSize=\"12\"/>\n                                        <color key=\"textColor\" red=\"0.51576060056686401\" green=\"0.54782974720001221\" blue=\"0.62907493114471436\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Delay: 0\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"nfx-rk-xQP\">\n                                        <fontDescription key=\"fontDescription\" name=\"Avenir-Heavy\" family=\"Avenir\" pointSize=\"12\"/>\n                                        <color key=\"textColor\" red=\"0.51576060056686401\" green=\"0.54782974720001221\" blue=\"0.62907493114471436\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                </subviews>\n                                <color key=\"backgroundColor\" red=\"0.92941176469999998\" green=\"0.94509803920000002\" blue=\"0.96078431369999995\" alpha=\"0.5\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"bottom\" secondItem=\"afX-4m-2dp\" secondAttribute=\"bottom\" id=\"1eb-9b-h6d\"/>\n                                    <constraint firstItem=\"afX-4m-2dp\" firstAttribute=\"leading\" secondItem=\"Mpa-80-hgk\" secondAttribute=\"leading\" id=\"1jm-Ss-jJD\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"8lZ-4r-F62\" secondAttribute=\"trailing\" constant=\"15\" id=\"3og-cZ-28y\"/>\n                                    <constraint firstItem=\"xk2-sC-g25\" firstAttribute=\"centerX\" secondItem=\"AkI-y0-NKD\" secondAttribute=\"centerX\" constant=\"0.5\" id=\"4D1-92-tWb\"/>\n                                    <constraint firstItem=\"afX-4m-2dp\" firstAttribute=\"top\" secondItem=\"8lZ-4r-F62\" secondAttribute=\"bottom\" constant=\"2\" id=\"82c-B6-4CV\"/>\n                                    <constraint firstItem=\"afX-4m-2dp\" firstAttribute=\"top\" secondItem=\"Vkq-iS-03i\" secondAttribute=\"bottom\" constant=\"2\" id=\"P5Q-Q6-k4L\"/>\n                                    <constraint firstItem=\"hZO-3H-UCU\" firstAttribute=\"centerX\" secondItem=\"Vkq-iS-03i\" secondAttribute=\"centerX\" constant=\"0.5\" id=\"Rc3-TA-Mlh\"/>\n                                    <constraint firstItem=\"xk2-sC-g25\" firstAttribute=\"top\" secondItem=\"AkI-y0-NKD\" secondAttribute=\"bottom\" constant=\"7\" id=\"aAF-gG-1hQ\"/>\n                                    <constraint firstItem=\"nfx-rk-xQP\" firstAttribute=\"top\" secondItem=\"8lZ-4r-F62\" secondAttribute=\"bottom\" constant=\"7\" id=\"da6-8l-41R\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"afX-4m-2dp\" secondAttribute=\"trailing\" id=\"h4J-qO-8O7\"/>\n                                    <constraint firstItem=\"hZO-3H-UCU\" firstAttribute=\"top\" secondItem=\"Vkq-iS-03i\" secondAttribute=\"bottom\" constant=\"7\" id=\"hue-dv-VWO\"/>\n                                    <constraint firstItem=\"afX-4m-2dp\" firstAttribute=\"top\" secondItem=\"AkI-y0-NKD\" secondAttribute=\"bottom\" constant=\"2\" id=\"kJF-fX-DIF\"/>\n                                    <constraint firstItem=\"nfx-rk-xQP\" firstAttribute=\"centerX\" secondItem=\"8lZ-4r-F62\" secondAttribute=\"centerX\" constant=\"0.5\" id=\"n6M-q2-55u\"/>\n                                    <constraint firstItem=\"afX-4m-2dp\" firstAttribute=\"centerX\" secondItem=\"AkI-y0-NKD\" secondAttribute=\"centerX\" id=\"uro-Gp-IG5\"/>\n                                    <constraint firstItem=\"Vkq-iS-03i\" firstAttribute=\"leading\" secondItem=\"Mpa-80-hgk\" secondAttribute=\"leading\" constant=\"15\" id=\"xBb-q1-Qxw\"/>\n                                </constraints>\n                            </view>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"jEx-iK-Wpm\" secondAttribute=\"bottom\" constant=\"260\" id=\"9YW-cY-h2z\"/>\n                            <constraint firstItem=\"Mpa-80-hgk\" firstAttribute=\"top\" secondItem=\"jEx-iK-Wpm\" secondAttribute=\"bottom\" constant=\"8\" id=\"AF7-U1-JtU\"/>\n                            <constraint firstItem=\"Mpa-80-hgk\" firstAttribute=\"leading\" secondItem=\"PVY-HA-UuV\" secondAttribute=\"leading\" id=\"F9O-Ei-pyO\"/>\n                            <constraint firstItem=\"jEx-iK-Wpm\" firstAttribute=\"leading\" secondItem=\"PVY-HA-UuV\" secondAttribute=\"leading\" id=\"FI0-bs-M2X\"/>\n                            <constraint firstItem=\"Mpa-80-hgk\" firstAttribute=\"top\" secondItem=\"jEx-iK-Wpm\" secondAttribute=\"bottom\" id=\"Hdp-A4-BqA\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"Mpa-80-hgk\" secondAttribute=\"trailing\" id=\"IgS-mO-S1v\"/>\n                            <constraint firstItem=\"Mpa-80-hgk\" firstAttribute=\"top\" secondItem=\"jEx-iK-Wpm\" secondAttribute=\"bottom\" constant=\"8\" id=\"Nec-Vy-qhb\"/>\n                            <constraint firstItem=\"Mpa-80-hgk\" firstAttribute=\"top\" secondItem=\"PVY-HA-UuV\" secondAttribute=\"top\" constant=\"340\" id=\"V3b-SI-YOg\"/>\n                            <constraint firstItem=\"9I4-Bi-XrU\" firstAttribute=\"top\" secondItem=\"Mpa-80-hgk\" secondAttribute=\"bottom\" id=\"jgt-a7-2k4\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"jEx-iK-Wpm\" secondAttribute=\"trailing\" id=\"lOm-Wk-tqa\"/>\n                            <constraint firstItem=\"jEx-iK-Wpm\" firstAttribute=\"top\" secondItem=\"PVY-HA-UuV\" secondAttribute=\"top\" id=\"xmN-hg-zCQ\"/>\n                        </constraints>\n                        <variation key=\"default\">\n                            <mask key=\"constraints\">\n                                <exclude reference=\"AF7-U1-JtU\"/>\n                                <exclude reference=\"Nec-Vy-qhb\"/>\n                                <exclude reference=\"V3b-SI-YOg\"/>\n                            </mask>\n                        </variation>\n                    </view>\n                    <connections>\n                        <outlet property=\"animationPicker\" destination=\"afX-4m-2dp\" id=\"SdP-G4-1Oj\"/>\n                        <outlet property=\"ballView\" destination=\"pm9-y7-HlR\" id=\"u3S-vQ-pY3\"/>\n                        <outlet property=\"delayLabel\" destination=\"nfx-rk-xQP\" id=\"Esx-IV-Sb1\"/>\n                        <outlet property=\"delaySlider\" destination=\"8lZ-4r-F62\" id=\"OPI-qd-973\"/>\n                        <outlet property=\"durationLabel\" destination=\"xk2-sC-g25\" id=\"DhZ-TW-o9N\"/>\n                        <outlet property=\"durationSlider\" destination=\"AkI-y0-NKD\" id=\"4gv-7c-JV5\"/>\n                        <outlet property=\"forceLabel\" destination=\"hZO-3H-UCU\" id=\"ce1-VP-A6b\"/>\n                        <outlet property=\"forceSlider\" destination=\"Vkq-iS-03i\" id=\"OcW-56-47O\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"2wM-Df-GyY\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1111\" y=\"315\"/>\n        </scene>\n        <!--Code View Controller-->\n        <scene sceneID=\"FIC-8l-Zvm\">\n            <objects>\n                <viewController id=\"gI9-MU-NP6\" customClass=\"CodeViewController\" customModule=\"SpringApp\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"Cdh-iV-bjE\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"Gnh-dh-azC\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"diL-kH-pKD\">\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                            <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"WDl-Yq-pxG\">\n                                <state key=\"normal\">\n                                    <color key=\"titleShadowColor\" red=\"0.5\" green=\"0.5\" blue=\"0.5\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                </state>\n                                <connections>\n                                    <action selector=\"closeButtonPressed:\" destination=\"gI9-MU-NP6\" eventType=\"touchUpInside\" id=\"6gZ-Qa-jTE\"/>\n                                </connections>\n                            </button>\n                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"w0U-Rm-19b\" customClass=\"SpringView\" customModule=\"Spring\">\n                                <subviews>\n                                    <textView clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" editable=\"NO\" text=\"layer.animation = &quot;shake&quot;\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"QYe-M8-GcU\">\n                                        <color key=\"backgroundColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <color key=\"textColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <fontDescription key=\"fontDescription\" name=\"Menlo-Regular\" family=\"Menlo\" pointSize=\"14\"/>\n                                        <textInputTraits key=\"textInputTraits\" autocapitalizationType=\"sentences\"/>\n                                    </textView>\n                                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Code\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"jUx-Gp-qoT\">\n                                        <fontDescription key=\"fontDescription\" name=\"AvenirNext-Regular\" family=\"Avenir Next\" pointSize=\"20\"/>\n                                        <color key=\"textColor\" red=\"0.51576060056686401\" green=\"0.54782974720001221\" blue=\"0.62907493114471436\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"yhW-Bx-O4o\">\n                                        <color key=\"backgroundColor\" red=\"0.23921568630000001\" green=\"0.25882352939999997\" blue=\"0.30588235289999999\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                    </view>\n                                </subviews>\n                                <color key=\"backgroundColor\" red=\"0.23921568630000001\" green=\"0.25882352939999997\" blue=\"0.30588235289999999\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <constraints>\n                                    <constraint firstItem=\"yhW-Bx-O4o\" firstAttribute=\"top\" secondItem=\"w0U-Rm-19b\" secondAttribute=\"top\" id=\"3uX-fZ-rIk\"/>\n                                    <constraint firstItem=\"QYe-M8-GcU\" firstAttribute=\"leading\" secondItem=\"w0U-Rm-19b\" secondAttribute=\"leading\" constant=\"10\" id=\"6Im-9V-IYN\"/>\n                                    <constraint firstItem=\"jUx-Gp-qoT\" firstAttribute=\"top\" secondItem=\"w0U-Rm-19b\" secondAttribute=\"top\" constant=\"30\" id=\"8eK-QR-S7b\"/>\n                                    <constraint firstItem=\"yhW-Bx-O4o\" firstAttribute=\"leading\" secondItem=\"w0U-Rm-19b\" secondAttribute=\"leading\" constant=\"-290\" id=\"E9e-hR-rvz\"/>\n                                    <constraint firstAttribute=\"bottom\" secondItem=\"yhW-Bx-O4o\" secondAttribute=\"bottom\" id=\"WWv-SK-HA2\"/>\n                                    <constraint firstAttribute=\"bottom\" secondItem=\"QYe-M8-GcU\" secondAttribute=\"bottom\" constant=\"10\" id=\"bBK-7i-q1R\"/>\n                                    <constraint firstItem=\"QYe-M8-GcU\" firstAttribute=\"leading\" secondItem=\"yhW-Bx-O4o\" secondAttribute=\"trailing\" id=\"cgV-59-aWe\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"300\" id=\"jiZ-9d-R1i\"/>\n                                    <constraint firstAttribute=\"centerX\" secondItem=\"jUx-Gp-qoT\" secondAttribute=\"centerX\" id=\"nL7-wh-det\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"QYe-M8-GcU\" secondAttribute=\"trailing\" constant=\"10\" id=\"sKf-sj-Qcr\"/>\n                                    <constraint firstItem=\"QYe-M8-GcU\" firstAttribute=\"top\" secondItem=\"jUx-Gp-qoT\" secondAttribute=\"bottom\" constant=\"8.5\" id=\"xVO-L4-qKb\"/>\n                                </constraints>\n                                <userDefinedRuntimeAttributes>\n                                    <userDefinedRuntimeAttribute type=\"string\" keyPath=\"animation\" value=\"squeezeRight\"/>\n                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"animateFrom\" value=\"YES\"/>\n                                </userDefinedRuntimeAttributes>\n                            </view>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"WDl-Yq-pxG\" firstAttribute=\"top\" secondItem=\"diL-kH-pKD\" secondAttribute=\"top\" id=\"EAX-h3-Mmw\"/>\n                            <constraint firstItem=\"Gnh-dh-azC\" firstAttribute=\"top\" secondItem=\"WDl-Yq-pxG\" secondAttribute=\"bottom\" id=\"I6b-5N-cjN\"/>\n                            <constraint firstItem=\"w0U-Rm-19b\" firstAttribute=\"leading\" secondItem=\"diL-kH-pKD\" secondAttribute=\"leading\" id=\"JVt-bO-12t\"/>\n                            <constraint firstItem=\"WDl-Yq-pxG\" firstAttribute=\"leading\" secondItem=\"w0U-Rm-19b\" secondAttribute=\"trailing\" id=\"PiW-m2-KZ8\"/>\n                            <constraint firstItem=\"w0U-Rm-19b\" firstAttribute=\"top\" secondItem=\"diL-kH-pKD\" secondAttribute=\"top\" id=\"mhd-BH-PNx\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"WDl-Yq-pxG\" secondAttribute=\"trailing\" id=\"x5w-F3-2yX\"/>\n                            <constraint firstItem=\"Gnh-dh-azC\" firstAttribute=\"top\" secondItem=\"w0U-Rm-19b\" secondAttribute=\"bottom\" id=\"zzE-Hu-zJ4\"/>\n                        </constraints>\n                    </view>\n                    <connections>\n                        <outlet property=\"codeTextView\" destination=\"QYe-M8-GcU\" id=\"9mQ-DZ-Ybr\"/>\n                        <outlet property=\"modalView\" destination=\"w0U-Rm-19b\" id=\"eix-Ci-v0v\"/>\n                        <outlet property=\"titleLabel\" destination=\"jUx-Gp-qoT\" id=\"f9i-4D-BGh\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"CB3-m9-O4j\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1827\" y=\"315\"/>\n        </scene>\n        <!--Options View Controller-->\n        <scene sceneID=\"wF4-oh-fMB\">\n            <objects>\n                <viewController id=\"TLI-qL-rpM\" customClass=\"OptionsViewController\" customModule=\"SpringApp\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"UWe-6I-A49\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"SLM-Nn-1rU\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"GfF-r4-vRP\">\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                            <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"5Zg-Sj-2iX\">\n                                <state key=\"normal\">\n                                    <color key=\"titleShadowColor\" red=\"0.5\" green=\"0.5\" blue=\"0.5\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                </state>\n                                <connections>\n                                    <action selector=\"closeButtonPressed:\" destination=\"TLI-qL-rpM\" eventType=\"touchUpInside\" id=\"Ezy-PN-qV0\"/>\n                                </connections>\n                            </button>\n                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"lGB-5Y-C2z\" customClass=\"SpringView\" customModule=\"Spring\">\n                                <subviews>\n                                    <slider opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" value=\"0.69999998807907104\" minValue=\"0.0\" maxValue=\"1\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"EqA-ng-ZaN\">\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" constant=\"86\" id=\"K9k-UU-sai\"/>\n                                            <constraint firstAttribute=\"height\" constant=\"30\" id=\"lyn-rN-SRs\"/>\n                                        </constraints>\n                                        <color key=\"minimumTrackTintColor\" red=\"0.15340511500835419\" green=\"0.61420810222625732\" blue=\"0.9250943660736084\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <color key=\"maximumTrackTintColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"0.20000000000000001\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <connections>\n                                            <action selector=\"dampingSliderChanged:\" destination=\"TLI-qL-rpM\" eventType=\"valueChanged\" id=\"FJS-Wh-VOq\"/>\n                                            <action selector=\"forceSliderChanged:\" destination=\"uF9-EU-g6i\" eventType=\"valueChanged\" id=\"A03-fO-WLN\"/>\n                                        </connections>\n                                    </slider>\n                                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Damping: 0.7\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"rM7-dW-gD1\">\n                                        <fontDescription key=\"fontDescription\" name=\"AvenirNext-DemiBold\" family=\"Avenir Next\" pointSize=\"12\"/>\n                                        <color key=\"textColor\" red=\"0.51576060056686401\" green=\"0.54782974720001221\" blue=\"0.62907493114471436\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                    <slider opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" value=\"0.69999998807907104\" minValue=\"0.0\" maxValue=\"1\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"P2p-U0-U48\">\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" constant=\"86\" id=\"BzJ-vp-Nar\"/>\n                                            <constraint firstAttribute=\"height\" constant=\"30\" id=\"bUz-7g-C7D\"/>\n                                        </constraints>\n                                        <color key=\"minimumTrackTintColor\" red=\"0.15340511500835419\" green=\"0.61420810222625732\" blue=\"0.9250943660736084\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <color key=\"maximumTrackTintColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"0.20000000000000001\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <connections>\n                                            <action selector=\"forceSliderChanged:\" destination=\"uF9-EU-g6i\" eventType=\"valueChanged\" id=\"QKl-4V-Gsm\"/>\n                                            <action selector=\"velocitySliderChanged:\" destination=\"TLI-qL-rpM\" eventType=\"valueChanged\" id=\"sHd-fw-2K6\"/>\n                                        </connections>\n                                    </slider>\n                                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Velocity: 0.7\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kqf-ZO-435\">\n                                        <fontDescription key=\"fontDescription\" name=\"AvenirNext-DemiBold\" family=\"Avenir Next\" pointSize=\"12\"/>\n                                        <color key=\"textColor\" red=\"0.51576060056686401\" green=\"0.54782974720001221\" blue=\"0.62907493114471436\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                    <slider opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" minValue=\"0.0\" maxValue=\"5\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"hp3-5D-ajZ\">\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" constant=\"86\" id=\"3wR-k9-xTa\"/>\n                                            <constraint firstAttribute=\"height\" constant=\"30\" id=\"4px-bW-89E\"/>\n                                        </constraints>\n                                        <color key=\"minimumTrackTintColor\" red=\"0.15340511500835419\" green=\"0.61420810222625732\" blue=\"0.9250943660736084\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <color key=\"maximumTrackTintColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"0.20000000000000001\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <connections>\n                                            <action selector=\"forceSliderChanged:\" destination=\"uF9-EU-g6i\" eventType=\"valueChanged\" id=\"KHU-DR-Wey\"/>\n                                            <action selector=\"rotateSliderChanged:\" destination=\"TLI-qL-rpM\" eventType=\"valueChanged\" id=\"TcI-R0-THJ\"/>\n                                        </connections>\n                                    </slider>\n                                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Rotate: 0\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Sss-g7-hcA\">\n                                        <fontDescription key=\"fontDescription\" name=\"AvenirNext-DemiBold\" family=\"Avenir Next\" pointSize=\"12\"/>\n                                        <color key=\"textColor\" red=\"0.51576060056686401\" green=\"0.54782974720001221\" blue=\"0.62907493114471436\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                    <slider opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" minValue=\"0.0\" maxValue=\"300\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"tuU-kH-fxY\">\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" constant=\"86\" id=\"00T-Tj-z8w\"/>\n                                            <constraint firstAttribute=\"height\" constant=\"30\" id=\"L5G-Cm-PKD\"/>\n                                        </constraints>\n                                        <color key=\"minimumTrackTintColor\" red=\"0.15340511500835419\" green=\"0.61420810222625732\" blue=\"0.9250943660736084\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <color key=\"maximumTrackTintColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"0.20000000000000001\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <connections>\n                                            <action selector=\"forceSliderChanged:\" destination=\"uF9-EU-g6i\" eventType=\"valueChanged\" id=\"lgY-L0-IiW\"/>\n                                            <action selector=\"xSliderChanged:\" destination=\"TLI-qL-rpM\" eventType=\"valueChanged\" id=\"Scg-AE-c0n\"/>\n                                        </connections>\n                                    </slider>\n                                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"x: 0\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8i2-8d-Gyo\">\n                                        <fontDescription key=\"fontDescription\" name=\"AvenirNext-DemiBold\" family=\"Avenir Next\" pointSize=\"12\"/>\n                                        <color key=\"textColor\" red=\"0.51576060056686401\" green=\"0.54782974720001221\" blue=\"0.62907493114471436\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                    <slider opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" minValue=\"0.0\" maxValue=\"300\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"WeN-Ux-Pdh\">\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" constant=\"86\" id=\"Fq8-dY-J5H\"/>\n                                            <constraint firstAttribute=\"height\" constant=\"30\" id=\"Xil-lQ-Ii6\"/>\n                                        </constraints>\n                                        <color key=\"minimumTrackTintColor\" red=\"0.15340511500835419\" green=\"0.61420810222625732\" blue=\"0.9250943660736084\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <color key=\"maximumTrackTintColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"0.20000000000000001\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <connections>\n                                            <action selector=\"forceSliderChanged:\" destination=\"uF9-EU-g6i\" eventType=\"valueChanged\" id=\"ziv-DU-lLU\"/>\n                                            <action selector=\"ySliderChanged:\" destination=\"TLI-qL-rpM\" eventType=\"valueChanged\" id=\"5lY-h3-wEB\"/>\n                                        </connections>\n                                    </slider>\n                                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"y: 0\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8kG-Ub-7Gx\">\n                                        <fontDescription key=\"fontDescription\" name=\"AvenirNext-DemiBold\" family=\"Avenir Next\" pointSize=\"12\"/>\n                                        <color key=\"textColor\" red=\"0.51576060056686401\" green=\"0.54782974720001221\" blue=\"0.62907493114471436\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                    <slider opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" value=\"1\" minValue=\"1\" maxValue=\"5\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"6UY-eF-UAm\">\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"30\" id=\"3uC-E3-FRl\"/>\n                                            <constraint firstAttribute=\"width\" constant=\"86\" id=\"b1q-Wz-FNX\"/>\n                                        </constraints>\n                                        <color key=\"minimumTrackTintColor\" red=\"0.15340511500835419\" green=\"0.61420810222625732\" blue=\"0.9250943660736084\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <color key=\"maximumTrackTintColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"0.20000000000000001\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <connections>\n                                            <action selector=\"forceSliderChanged:\" destination=\"uF9-EU-g6i\" eventType=\"valueChanged\" id=\"oqi-mD-dZS\"/>\n                                            <action selector=\"scaleSliderChanged:\" destination=\"TLI-qL-rpM\" eventType=\"valueChanged\" id=\"EF6-fQ-SYl\"/>\n                                        </connections>\n                                    </slider>\n                                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Scale: 1\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"PFw-Jb-2Xm\">\n                                        <fontDescription key=\"fontDescription\" name=\"AvenirNext-DemiBold\" family=\"Avenir Next\" pointSize=\"12\"/>\n                                        <color key=\"textColor\" red=\"0.51576060056686401\" green=\"0.54782974720001221\" blue=\"0.62907493114471436\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                    <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"WbE-Ar-bLf\" customClass=\"DesignableButton\" customModule=\"Spring\">\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"36\" id=\"Gt6-ig-db1\"/>\n                                            <constraint firstAttribute=\"width\" constant=\"100\" id=\"oBI-wy-nzi\"/>\n                                        </constraints>\n                                        <fontDescription key=\"fontDescription\" name=\"AvenirNext-DemiBold\" family=\"Avenir Next\" pointSize=\"16\"/>\n                                        <state key=\"normal\" title=\"Reset\">\n                                            <color key=\"titleColor\" red=\"0.51576060056686401\" green=\"0.54782974720001221\" blue=\"0.62907493114471436\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                            <color key=\"titleShadowColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        </state>\n                                        <userDefinedRuntimeAttributes>\n                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"cornerRadius\">\n                                                <real key=\"value\" value=\"3\"/>\n                                            </userDefinedRuntimeAttribute>\n                                            <userDefinedRuntimeAttribute type=\"number\" keyPath=\"borderWidth\">\n                                                <real key=\"value\" value=\"1\"/>\n                                            </userDefinedRuntimeAttribute>\n                                            <userDefinedRuntimeAttribute type=\"color\" keyPath=\"borderColor\">\n                                                <color key=\"value\" red=\"0.51576060056686401\" green=\"0.54782974720001221\" blue=\"0.62907493114471436\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                            </userDefinedRuntimeAttribute>\n                                        </userDefinedRuntimeAttributes>\n                                        <connections>\n                                            <action selector=\"resetButtonPressed:\" destination=\"TLI-qL-rpM\" eventType=\"touchUpInside\" id=\"0cE-Y8-6dl\"/>\n                                        </connections>\n                                    </button>\n                                </subviews>\n                                <color key=\"backgroundColor\" red=\"0.23921568630000001\" green=\"0.25882352939999997\" blue=\"0.30588235289999999\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"centerX\" secondItem=\"WbE-Ar-bLf\" secondAttribute=\"centerX\" id=\"3q2-yh-Ybl\"/>\n                                    <constraint firstItem=\"EqA-ng-ZaN\" firstAttribute=\"top\" secondItem=\"lGB-5Y-C2z\" secondAttribute=\"top\" constant=\"35\" id=\"6Qu-N6-4Gs\"/>\n                                    <constraint firstItem=\"Sss-g7-hcA\" firstAttribute=\"top\" secondItem=\"hp3-5D-ajZ\" secondAttribute=\"bottom\" constant=\"6.5\" id=\"7fN-2B-svp\"/>\n                                    <constraint firstItem=\"WbE-Ar-bLf\" firstAttribute=\"top\" secondItem=\"8kG-Ub-7Gx\" secondAttribute=\"bottom\" constant=\"29\" id=\"7pX-za-V55\"/>\n                                    <constraint firstItem=\"kqf-ZO-435\" firstAttribute=\"centerX\" secondItem=\"P2p-U0-U48\" secondAttribute=\"centerX\" constant=\"0.5\" id=\"89v-Cf-WeC\"/>\n                                    <constraint firstItem=\"6UY-eF-UAm\" firstAttribute=\"top\" secondItem=\"hp3-5D-ajZ\" secondAttribute=\"bottom\" constant=\"51\" id=\"93Z-4G-cdy\"/>\n                                    <constraint firstAttribute=\"centerX\" secondItem=\"WeN-Ux-Pdh\" secondAttribute=\"centerX\" id=\"A0L-HO-nic\"/>\n                                    <constraint firstItem=\"tuU-kH-fxY\" firstAttribute=\"leading\" secondItem=\"lGB-5Y-C2z\" secondAttribute=\"leading\" constant=\"15\" id=\"H7r-N1-b8C\"/>\n                                    <constraint firstItem=\"8kG-Ub-7Gx\" firstAttribute=\"top\" secondItem=\"WeN-Ux-Pdh\" secondAttribute=\"bottom\" constant=\"6.5\" id=\"KrF-gs-5oU\"/>\n                                    <constraint firstItem=\"WeN-Ux-Pdh\" firstAttribute=\"centerX\" secondItem=\"8kG-Ub-7Gx\" secondAttribute=\"centerX\" id=\"Mdc-2s-1pc\"/>\n                                    <constraint firstItem=\"PFw-Jb-2Xm\" firstAttribute=\"top\" secondItem=\"6UY-eF-UAm\" secondAttribute=\"bottom\" constant=\"6\" id=\"QO0-Wz-vcZ\"/>\n                                    <constraint firstItem=\"tuU-kH-fxY\" firstAttribute=\"top\" secondItem=\"EqA-ng-ZaN\" secondAttribute=\"bottom\" constant=\"51\" id=\"SIY-9j-OjG\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"6UY-eF-UAm\" secondAttribute=\"trailing\" constant=\"15\" id=\"SNb-A0-4Ni\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"360\" id=\"Thv-hf-bgU\"/>\n                                    <constraint firstItem=\"8i2-8d-Gyo\" firstAttribute=\"top\" secondItem=\"tuU-kH-fxY\" secondAttribute=\"bottom\" constant=\"6.5\" id=\"Z6g-Pg-J9Z\"/>\n                                    <constraint firstItem=\"kqf-ZO-435\" firstAttribute=\"top\" secondItem=\"P2p-U0-U48\" secondAttribute=\"bottom\" constant=\"6.5\" id=\"cD1-0G-GxK\"/>\n                                    <constraint firstItem=\"P2p-U0-U48\" firstAttribute=\"top\" secondItem=\"lGB-5Y-C2z\" secondAttribute=\"top\" constant=\"35\" id=\"fim-re-Tvs\"/>\n                                    <constraint firstItem=\"rM7-dW-gD1\" firstAttribute=\"top\" secondItem=\"EqA-ng-ZaN\" secondAttribute=\"bottom\" constant=\"7\" id=\"gy4-M2-2a8\"/>\n                                    <constraint firstItem=\"rM7-dW-gD1\" firstAttribute=\"centerX\" secondItem=\"EqA-ng-ZaN\" secondAttribute=\"centerX\" id=\"iMG-zU-bVk\"/>\n                                    <constraint firstItem=\"WeN-Ux-Pdh\" firstAttribute=\"top\" secondItem=\"P2p-U0-U48\" secondAttribute=\"bottom\" constant=\"51\" id=\"ibF-Yl-SDb\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"hp3-5D-ajZ\" secondAttribute=\"trailing\" constant=\"15\" id=\"k7t-l0-jvZ\"/>\n                                    <constraint firstAttribute=\"centerX\" secondItem=\"P2p-U0-U48\" secondAttribute=\"centerX\" id=\"lnz-n5-rkT\"/>\n                                    <constraint firstItem=\"PFw-Jb-2Xm\" firstAttribute=\"centerX\" secondItem=\"6UY-eF-UAm\" secondAttribute=\"centerX\" id=\"pon-o7-o2z\"/>\n                                    <constraint firstItem=\"tuU-kH-fxY\" firstAttribute=\"centerX\" secondItem=\"8i2-8d-Gyo\" secondAttribute=\"centerX\" id=\"qCh-xs-aLi\"/>\n                                    <constraint firstItem=\"Sss-g7-hcA\" firstAttribute=\"centerX\" secondItem=\"hp3-5D-ajZ\" secondAttribute=\"centerX\" constant=\"0.5\" id=\"rg4-by-E5B\"/>\n                                    <constraint firstItem=\"hp3-5D-ajZ\" firstAttribute=\"top\" secondItem=\"lGB-5Y-C2z\" secondAttribute=\"top\" constant=\"35\" id=\"tI2-8f-ZEE\"/>\n                                    <constraint firstItem=\"EqA-ng-ZaN\" firstAttribute=\"leading\" secondItem=\"lGB-5Y-C2z\" secondAttribute=\"leading\" constant=\"15\" id=\"uBy-dJ-VGW\"/>\n                                </constraints>\n                                <userDefinedRuntimeAttributes>\n                                    <userDefinedRuntimeAttribute type=\"string\" keyPath=\"animation\" value=\"squeezeUp\"/>\n                                    <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"animateFrom\" value=\"YES\"/>\n                                </userDefinedRuntimeAttributes>\n                            </view>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"SLM-Nn-1rU\" firstAttribute=\"top\" secondItem=\"lGB-5Y-C2z\" secondAttribute=\"bottom\" constant=\"-100\" id=\"5iG-ce-9Po\"/>\n                            <constraint firstItem=\"5Zg-Sj-2iX\" firstAttribute=\"leading\" secondItem=\"GfF-r4-vRP\" secondAttribute=\"leading\" id=\"U08-9E-ZGK\"/>\n                            <constraint firstItem=\"lGB-5Y-C2z\" firstAttribute=\"top\" secondItem=\"5Zg-Sj-2iX\" secondAttribute=\"bottom\" id=\"eag-fC-BEO\"/>\n                            <constraint firstItem=\"5Zg-Sj-2iX\" firstAttribute=\"top\" secondItem=\"GfF-r4-vRP\" secondAttribute=\"top\" id=\"fKp-a5-cLf\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"5Zg-Sj-2iX\" secondAttribute=\"trailing\" id=\"hPv-87-I93\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"lGB-5Y-C2z\" secondAttribute=\"trailing\" id=\"o6k-Mh-t9x\"/>\n                            <constraint firstItem=\"lGB-5Y-C2z\" firstAttribute=\"leading\" secondItem=\"GfF-r4-vRP\" secondAttribute=\"leading\" id=\"qAZ-W2-lzb\"/>\n                        </constraints>\n                    </view>\n                    <connections>\n                        <outlet property=\"dampingLabel\" destination=\"rM7-dW-gD1\" id=\"wH0-Uk-5ml\"/>\n                        <outlet property=\"dampingSlider\" destination=\"EqA-ng-ZaN\" id=\"5WY-8t-rzX\"/>\n                        <outlet property=\"modalView\" destination=\"lGB-5Y-C2z\" id=\"wMU-Bs-mMh\"/>\n                        <outlet property=\"rotateLabel\" destination=\"Sss-g7-hcA\" id=\"NL3-4o-32s\"/>\n                        <outlet property=\"rotateSlider\" destination=\"hp3-5D-ajZ\" id=\"8Go-do-2bg\"/>\n                        <outlet property=\"scaleLabel\" destination=\"PFw-Jb-2Xm\" id=\"xmu-OW-WwZ\"/>\n                        <outlet property=\"scaleSlider\" destination=\"6UY-eF-UAm\" id=\"hIu-5f-bS4\"/>\n                        <outlet property=\"velocityLabel\" destination=\"kqf-ZO-435\" id=\"w64-JN-1fH\"/>\n                        <outlet property=\"velocitySlider\" destination=\"P2p-U0-U48\" id=\"Mar-PQ-YjB\"/>\n                        <outlet property=\"xLabel\" destination=\"8i2-8d-Gyo\" id=\"G5H-7A-fFb\"/>\n                        <outlet property=\"xSlider\" destination=\"tuU-kH-fxY\" id=\"prF-yU-WXj\"/>\n                        <outlet property=\"yLabel\" destination=\"8kG-Ub-7Gx\" id=\"goX-4s-lbS\"/>\n                        <outlet property=\"ySlider\" destination=\"WeN-Ux-Pdh\" id=\"HdM-do-VcM\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"WF7-yJ-qnW\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1111\" y=\"1028\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"icon-shape\" width=\"30\" height=\"13\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "SpringApp/CodeViewController.swift",
    "content": "//\n//  CodeViewController.swift\n//  DesignerNewsApp\n//\n//  Created by Meng To on 2015-01-05.\n//  Copyright (c) 2015 Meng To. All rights reserved.\n//\n\nimport UIKit\nimport Spring\n\nclass CodeViewController: UIViewController {\n\n    @IBOutlet weak var modalView: SpringView!\n    @IBOutlet weak var codeTextView: UITextView!\n    @IBOutlet weak var titleLabel: UILabel!\n    var codeText: String = \"\"\n    var data: SpringView!\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        modalView.transform = CGAffineTransform(translationX: -300, y: 0)\n        \n        if data.animation != \"\" {\n            codeText += \"layer.animation = \\\"\\(data.animation)\\\"\\n\"\n        }\n        if data.curve != \"\" {\n            codeText += \"layer.curve = \\\"\\(data.curve)\\\"\\n\"\n        }\n        if data.force != 1 {\n            codeText += String(format: \"layer.force =  %.1f\\n\", Double(data.force))\n        }\n        if data.duration != 0.7 {\n            codeText += String(format: \"layer.duration =  %.1f\\n\", Double(data.duration))\n        }\n        if data.delay != 0 {\n            codeText += String(format: \"layer.delay =  %.1f\\n\", Double(data.delay))\n        }\n        if data.scaleX != 1 {\n            codeText += String(format: \"layer.scaleX =  %.1f\\n\", Double(data.scaleX))\n        }\n        if data.scaleY != 1 {\n            codeText += String(format: \"layer.scaleY =  %.1f\\n\", Double(data.scaleY))\n        }\n        if data.rotate != 0 {\n            codeText += String(format: \"layer.rotate =  %.1f\\n\", Double(data.rotate))\n        }\n        if data.damping != 0.7 {\n            codeText += String(format: \"layer.damping =  %.1f\\n\", Double(data.damping))\n        }\n        if data.velocity != 0.7 {\n            codeText += String(format: \"layer.velocity =  %.1f\\n\", Double(data.velocity))\n        }\n        codeText += \"layer.animate()\"\n        \n        codeTextView.text = codeText\n    }\n    \n    @IBAction func closeButtonPressed(_ sender: AnyObject) {\n        UIApplication.shared.sendAction(#selector(SpringViewController.maximizeView(_:)), to: nil, from: self, for: nil)\n        \n        modalView.animation = \"slideRight\"\n        modalView.animateFrom = false\n        modalView.animateToNext(completion: {\n            self.dismiss(animated: false, completion: nil)\n        })\n    }\n    \n    override func viewDidAppear(_ animated: Bool) {\n        super.viewDidAppear(true)\n        \n        modalView.animate()\n        \n        UIApplication.shared.sendAction(#selector(SpringViewController.minimizeView(_:)), to: nil, from: self, for: nil)\n    }\n}\n\n\n"
  },
  {
    "path": "SpringApp/Images.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"appicon@58.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"appicon@87.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"appicon@80.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"appicon@120.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"appicon@120-1.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"appicon@180.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"appicon@29.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"appicon@58-1.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"appicon@40.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"appicon@80-1.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"appicon@76.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"appicon@152.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"83.5x83.5\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"appicon@167.png\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "SpringApp/Images.xcassets/icon-shape.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon-shape.pdf\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "SpringApp/Images.xcassets/loading.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"loading.pdf\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "SpringApp/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>Spring</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</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\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>UIViewControllerBasedStatusBarAppearance</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "SpringApp/OptionsViewController.swift",
    "content": "//\n//  OptionsViewController.swift\n//  DesignerNewsApp\n//\n//  Created by Meng To on 2015-01-04.\n//  Copyright (c) 2015 Meng To. All rights reserved.\n//\n\nimport UIKit\nimport Spring\n\nprotocol OptionsViewControllerDelegate: class {\n    func dampingSliderChanged(_ sender: AnyObject)\n    func velocitySliderChanged(_ sender: AnyObject)\n    func scaleSliderChanged(_ sender: AnyObject)\n    func xSliderChanged(_ sender: AnyObject)\n    func ySliderChanged(_ sender: AnyObject)\n    func rotateSliderChanged(_ sender: AnyObject)\n    func resetButtonPressed(_ sender: AnyObject)\n}\n\nclass OptionsViewController: UIViewController {\n    \n    @IBOutlet weak var modalView: SpringView!\n    \n    @IBOutlet weak var dampingLabel: UILabel!\n    @IBOutlet weak var velocityLabel: UILabel!\n    @IBOutlet weak var scaleLabel: UILabel!\n    @IBOutlet weak var xLabel: UILabel!\n    @IBOutlet weak var yLabel: UILabel!\n    @IBOutlet weak var rotateLabel: UILabel!\n    \n    @IBOutlet weak var dampingSlider: UISlider!\n    @IBOutlet weak var velocitySlider: UISlider!\n    @IBOutlet weak var scaleSlider: UISlider!\n    @IBOutlet weak var xSlider: UISlider!\n    @IBOutlet weak var ySlider: UISlider!\n    @IBOutlet weak var rotateSlider: UISlider!\n    \n    var selectedDamping: CGFloat = 0.7\n    var selectedVelocity: CGFloat = 0.7\n    var selectedScale: CGFloat = 1\n    var selectedX: CGFloat = 0\n    var selectedY: CGFloat = 0\n    var selectedRotate: CGFloat = 0\n    \n    weak var delegate: OptionsViewControllerDelegate?\n    var data: SpringView!\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        modalView.transform = CGAffineTransform(translationX: 0, y: 300)\n        \n        dampingSlider.setValue(Float(data.damping), animated: true)\n        velocitySlider.setValue(Float(data.velocity), animated: true)\n        scaleSlider.setValue(Float(data.scaleX), animated: true)\n        xSlider.setValue(Float(data.x), animated: true)\n        ySlider.setValue(Float(data.y), animated: true)\n        rotateSlider.setValue(Float(data.rotate), animated: true)\n                \n        dampingLabel.text = getString(\"Damping\", value: data.damping)\n        velocityLabel.text = getString(\"Velocity\", value: data.velocity)\n        scaleLabel.text = getString(\"Scale\", value: data.scaleX)\n        xLabel.text = getString(\"x\", value: data.x)\n        yLabel.text = getString(\"y\", value: data.y)\n        rotateLabel.text = getString(\"Rotate\", value: data.rotate)\n    }\n\n    @IBAction func dampingSliderChanged(_ sender: AnyObject) {\n        selectedDamping = sender.value(forKey: \"value\") as! CGFloat\n        delegate?.dampingSliderChanged(sender)\n        dampingLabel.text = getString(\"Damping\", value: selectedDamping)\n    }\n    \n    @IBAction func velocitySliderChanged(_ sender: AnyObject) {\n        selectedVelocity = sender.value(forKey: \"value\") as! CGFloat\n        delegate?.velocitySliderChanged(sender)\n        velocityLabel.text = getString(\"Velocity\", value: selectedVelocity)\n    }\n    \n    @IBAction func scaleSliderChanged(_ sender: AnyObject) {\n        selectedScale = sender.value(forKey: \"value\") as! CGFloat\n        delegate?.scaleSliderChanged(sender)\n        scaleLabel.text = getString(\"Scale\", value: selectedScale)\n    }\n    \n    @IBAction func xSliderChanged(_ sender: AnyObject) {\n        selectedX = sender.value(forKey: \"value\") as! CGFloat\n        delegate?.xSliderChanged(sender)\n        xLabel.text = getString(\"X\", value: selectedX)\n    }\n    \n    @IBAction func ySliderChanged(_ sender: AnyObject) {\n        selectedY = sender.value(forKey: \"value\") as! CGFloat\n        delegate?.ySliderChanged(sender)\n        yLabel.text = getString(\"Y\", value: selectedY)\n    }\n    \n    @IBAction func rotateSliderChanged(_ sender: AnyObject) {\n        selectedRotate = sender.value(forKey: \"value\") as! CGFloat\n        delegate?.rotateSliderChanged(sender)\n        rotateLabel.text = getString(\"Rotate\", value: selectedRotate)\n    }\n    \n    @IBAction func resetButtonPressed(_ sender: AnyObject) {\n        delegate?.resetButtonPressed(sender)\n        dismiss(animated: true, completion: nil)\n        \n        UIApplication.shared.sendAction(#selector(SpringViewController.maximizeView(_:)), to: nil, from: self, for: nil)\n    }\n    \n    @IBAction func closeButtonPressed(_ sender: AnyObject) {\n        dismiss(animated: true, completion: nil)\n        \n        UIApplication.shared.sendAction(#selector(SpringViewController.maximizeView(_:)), to: nil, from: self, for: nil)\n    }\n    \n    override func viewDidAppear(_ animated: Bool) {\n        super.viewDidAppear(true)\n        \n        UIApplication.shared.sendAction(#selector(SpringViewController.minimizeView(_:)), to: nil, from: self, for: nil)\n        \n        modalView.animate()\n    }\n    \n    func getString(_ name: String, value: CGFloat) -> String {\n        return String(format: \"\\(name): %.1f\", Double(value))\n    }\n}\n"
  },
  {
    "path": "SpringApp/SpringViewController.swift",
    "content": "//\n//  SpringViewController.swift\n//  DesignerNewsApp\n//\n//  Created by Meng To on 2015-01-02.\n//  Copyright (c) 2015 Meng To. All rights reserved.\n//\n\nimport UIKit\nimport Spring\n\nclass SpringViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, OptionsViewControllerDelegate {\n\n    @IBOutlet weak var delayLabel: UILabel!\n    @IBOutlet weak var durationLabel: UILabel!\n    @IBOutlet weak var forceLabel: UILabel!\n    @IBOutlet weak var delaySlider: UISlider!\n    @IBOutlet weak var durationSlider: UISlider!\n    @IBOutlet weak var forceSlider: UISlider!\n    @IBOutlet weak var ballView: SpringView!\n    @IBOutlet weak var animationPicker: UIPickerView!\n    \n    var selectedRow: Int = 0\n    var selectedEasing: Int = 0\n    \n    var selectedForce: CGFloat = 1\n    var selectedDuration: CGFloat = 1\n    var selectedDelay: CGFloat = 0\n    \n    var selectedDamping: CGFloat = 0.7\n    var selectedVelocity: CGFloat = 0.7\n    var selectedScale: CGFloat = 1\n    var selectedX: CGFloat = 0\n    var selectedY: CGFloat = 0\n    var selectedRotate: CGFloat = 0\n    \n    @IBAction func forceSliderChanged(_ sender: AnyObject) {\n        selectedForce = sender.value(forKey: \"value\") as! CGFloat\n        animateView()\n        forceLabel.text = String(format: \"Force: %.1f\", Double(selectedForce))\n    }\n    @IBAction func durationSliderChanged(_ sender: AnyObject) {\n        selectedDuration = sender.value(forKey: \"value\") as! CGFloat\n        animateView()\n        durationLabel.text = String(format: \"Duration: %.1f\", Double(selectedDuration))\n    }\n    @IBAction func delaySliderChanged(_ sender: AnyObject) {\n        selectedDelay = sender.value(forKey: \"value\") as! CGFloat\n        animateView()\n        delayLabel.text = String(format: \"Delay: %.1f\", Double(selectedDelay))\n    }\n\n    func dampingSliderChanged(_ sender: AnyObject) {\n        selectedDamping = sender.value(forKey: \"value\") as! CGFloat\n        animateView()\n    }\n    \n    func velocitySliderChanged(_ sender: AnyObject) {\n        selectedVelocity = sender.value(forKey: \"value\") as! CGFloat\n        animateView()\n    }\n    \n    func scaleSliderChanged(_ sender: AnyObject) {\n        selectedScale = sender.value(forKey: \"value\") as! CGFloat\n        animateView()\n    }\n    \n    func xSliderChanged(_ sender: AnyObject) {\n        selectedX = sender.value(forKey: \"value\") as! CGFloat\n        animateView()\n    }\n    \n    func ySliderChanged(_ sender: AnyObject) {\n        selectedY = sender.value(forKey: \"value\") as! CGFloat\n        animateView()\n    }\n    \n    func rotateSliderChanged(_ sender: AnyObject) {\n        selectedRotate = sender.value(forKey: \"value\") as! CGFloat\n        animateView()\n    }\n    \n    func animateView() {\n        setOptions()\n        ballView.animate()\n    }\n    \n    func setOptions() {\n        ballView.force = selectedForce\n        ballView.duration = selectedDuration\n        ballView.delay = selectedDelay\n        \n        ballView.damping = selectedDamping\n        ballView.velocity = selectedVelocity\n        ballView.scaleX = selectedScale\n        ballView.scaleY = selectedScale\n        ballView.x = selectedX\n        ballView.y = selectedY\n        ballView.rotate = selectedRotate\n        \n        ballView.animation = animations[selectedRow].rawValue\n        ballView.curve = animationCurves[selectedEasing].rawValue\n    }\n    \n   @objc func minimizeView(_ sender: AnyObject) {\n        SpringAnimation.spring(duration: 0.7, animations: {\n            self.view.transform = CGAffineTransform(scaleX: 0.935, y: 0.935)\n        })\n        UIApplication.shared.setStatusBarStyle(UIStatusBarStyle.lightContent, animated: true)\n    }\n    \n   @objc func maximizeView(_ sender: AnyObject) {\n        SpringAnimation.spring(duration: 0.7, animations: {\n            self.view.transform = CGAffineTransform(scaleX: 1, y: 1)\n        })\n        UIApplication.shared.setStatusBarStyle(UIStatusBarStyle.default, animated: true)\n    }\n\n    let animations: [Spring.AnimationPreset] = [\n        .Shake,\n        .Pop,\n        .Morph,\n        .Squeeze,\n        .Wobble,\n        .Swing,\n        .FlipX,\n        .FlipY,\n        .Fall,\n        .SqueezeLeft,\n        .SqueezeRight,\n        .SqueezeDown,\n        .SqueezeUp,\n        .SlideLeft,\n        .SlideRight,\n        .SlideDown,\n        .SlideUp,\n        .FadeIn,\n        .FadeOut,\n        .FadeInLeft,\n        .FadeInRight,\n        .FadeInDown,\n        .FadeInUp,\n        .ZoomIn,\n        .ZoomOut,\n        .Flash\n    ]\n\n    var animationCurves: [Spring.AnimationCurve] = [\n        .EaseIn,\n        .EaseOut,\n        .EaseInOut,\n        .Linear,\n        .Spring,\n        .EaseInSine,\n        .EaseOutSine,\n        .EaseInOutSine,\n        .EaseInQuad,\n        .EaseOutQuad,\n        .EaseInOutQuad,\n        .EaseInCubic,\n        .EaseOutCubic,\n        .EaseInOutCubic,\n        .EaseInQuart,\n        .EaseOutQuart,\n        .EaseInOutQuart,\n        .EaseInQuint,\n        .EaseOutQuint,\n        .EaseInOutQuint,\n        .EaseInExpo,\n        .EaseOutExpo,\n        .EaseInOutExpo,\n        .EaseInCirc,\n        .EaseOutCirc,\n        .EaseInOutCirc,\n        .EaseInBack,\n        .EaseOutBack,\n        .EaseInOutBack\n    ]\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        animationPicker.delegate = self\n        animationPicker.dataSource = self\n        animationPicker.showsSelectionIndicator = true\n    }\n    \n    @IBAction func ballButtonPressed(_ sender: AnyObject) {\n        \n        UIView.animate(withDuration: 0.1, animations: {\n            self.ballView.backgroundColor = UIColor(hex: \"69DBFF\")\n        }, completion: { finished in\n            UIView.animate(withDuration: 0.5, animations: {\n                self.ballView.backgroundColor = UIColor(hex: \"#279CEB\")\n            })\n        })\n        \n        animateView()\n    }\n    \n    var isBall = false\n    func changeBall() {\n        isBall = !isBall\n        let animation = CABasicAnimation()\n        let halfWidth = ballView.frame.width / 2\n        let cornerRadius: CGFloat = isBall ? halfWidth : 10\n        animation.keyPath = \"cornerRadius\"\n        animation.fromValue = isBall ? 10 : halfWidth\n        animation.toValue = cornerRadius\n        animation.duration = 0.2\n        ballView.layer.cornerRadius = cornerRadius\n        ballView.layer.add(animation, forKey: \"radius\")\n    }\n    \n    @IBAction func shapeButtonPressed(_ sender: AnyObject) {\n        changeBall()\n    }\n    \n    func resetButtonPressed(_ sender: AnyObject) {\n        selectedForce = 1\n        selectedDuration = 1\n        selectedDelay = 0\n        \n        selectedDamping = 0.7\n        selectedVelocity = 0.7\n        selectedScale = 1\n        selectedX = 0\n        selectedY = 0\n        selectedRotate = 0\n        \n        forceSlider.setValue(Float(selectedForce), animated: true)\n        durationSlider.setValue(Float(selectedDuration), animated: true)\n        delaySlider.setValue(Float(selectedDelay), animated: true)\n        \n        forceLabel.text = String(format: \"Force: %.1f\", Double(selectedForce))\n        durationLabel.text = String(format: \"Duration: %.1f\", Double(selectedDuration))\n        delayLabel.text = String(format: \"Delay: %.1f\", Double(selectedDelay))\n    }\n    \n    func numberOfComponents(in pickerView: UIPickerView) -> Int {\n        return 2\n    }\n    \n    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {\n        return component == 0 ? animations.count : animationCurves.count\n    }\n    \n    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {\n        return component == 0 ? animations[row].rawValue : animationCurves[row].rawValue\n    }\n    \n    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {\n        switch component {\n        case 0:\n            selectedRow = row\n            animateView()\n        default:\n            selectedEasing = row\n            animateView()\n        }\n    }\n    \n    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {\n        if let optionsViewController = segue.destination as? OptionsViewController {\n            optionsViewController.delegate = self\n            setOptions()\n            optionsViewController.data = ballView\n        }\n        else if let codeViewController = segue.destination as? CodeViewController {\n            setOptions()\n            codeViewController.data = ballView\n        }\n    }\n}\n"
  },
  {
    "path": "SpringApp.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\t1A4FDA381A6E44780099D309 /* Spring.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A4FDA371A6E44780099D309 /* Spring.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t1A4FDA3E1A6E44780099D309 /* Spring.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A4FDA331A6E44780099D309 /* Spring.framework */; };\n\t\t1A4FDA471A6E44780099D309 /* SpringTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A4FDA461A6E44780099D309 /* SpringTests.swift */; };\n\t\t1A4FDA4A1A6E44780099D309 /* Spring.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A4FDA331A6E44780099D309 /* Spring.framework */; };\n\t\t1A4FDA4B1A6E44780099D309 /* Spring.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A4FDA331A6E44780099D309 /* Spring.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t1A4FDA531A6E44A70099D309 /* LoadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A4FDA2A1A6E44270099D309 /* LoadingView.swift */; };\n\t\t1A4FDA541A6E44A70099D309 /* LoadingView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1A4FDA2B1A6E44270099D309 /* LoadingView.xib */; };\n\t\t1A4FDA551A6E44A70099D309 /* BlurView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 961888D31A66BF9000295A64 /* BlurView.swift */; };\n\t\t1A4FDA571A6E44A70099D309 /* DesignableButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 961888D51A66BF9000295A64 /* DesignableButton.swift */; };\n\t\t1A4FDA581A6E44A70099D309 /* DesignableImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 961888D61A66BF9000295A64 /* DesignableImageView.swift */; };\n\t\t1A4FDA591A6E44A70099D309 /* DesignableLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 961888D71A66BF9000295A64 /* DesignableLabel.swift */; };\n\t\t1A4FDA5A1A6E44A70099D309 /* DesignableTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 961888D81A66BF9000295A64 /* DesignableTextField.swift */; };\n\t\t1A4FDA5B1A6E44A70099D309 /* DesignableTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 961888D91A66BF9000295A64 /* DesignableTextView.swift */; };\n\t\t1A4FDA5C1A6E44A70099D309 /* DesignableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 961888DA1A66BF9000295A64 /* DesignableView.swift */; };\n\t\t1A4FDA5D1A6E44A70099D309 /* DesignableTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 969775D31A6AD6AC009B4B79 /* DesignableTabBarController.swift */; };\n\t\t1A4FDA5E1A6E44A70099D309 /* ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 961888DB1A66BF9000295A64 /* ImageLoader.swift */; };\n\t\t1A4FDA601A6E44A70099D309 /* Misc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 961888DF1A66BF9000295A64 /* Misc.swift */; };\n\t\t1A4FDA611A6E44A70099D309 /* Spring.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AD08AC61A676D5800160D45 /* Spring.swift */; };\n\t\t1A4FDA621A6E44A70099D309 /* SpringAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 961888E01A66BF9000295A64 /* SpringAnimation.swift */; };\n\t\t1A4FDA631A6E44A70099D309 /* SpringButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 961888E11A66BF9000295A64 /* SpringButton.swift */; };\n\t\t1A4FDA641A6E44A70099D309 /* SpringImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AF3F11A1A6776760090E8F9 /* SpringImageView.swift */; };\n\t\t1A4FDA651A6E44A70099D309 /* SpringLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AF3F11B1A6776760090E8F9 /* SpringLabel.swift */; };\n\t\t1A4FDA661A6E44A70099D309 /* SpringTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AF3F11C1A6776760090E8F9 /* SpringTextField.swift */; };\n\t\t1A4FDA671A6E44A70099D309 /* SpringTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AF3F11D1A6776760090E8F9 /* SpringTextView.swift */; };\n\t\t1A4FDA681A6E44A70099D309 /* SpringView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 961888E21A66BF9000295A64 /* SpringView.swift */; };\n\t\t1A4FDA691A6E44A70099D309 /* TransitionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 961888E31A66BF9000295A64 /* TransitionManager.swift */; };\n\t\t1A4FDA6A1A6E44A70099D309 /* TransitionZoom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 961888E41A66BF9000295A64 /* TransitionZoom.swift */; };\n\t\t1A4FDA6B1A6E44A70099D309 /* UnwindSegue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 961888E51A66BF9000295A64 /* UnwindSegue.swift */; };\n\t\t1A585F401A7B9530007EEB7D /* KeyboardLayoutConstraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A585F3F1A7B9530007EEB7D /* KeyboardLayoutConstraint.swift */; };\n\t\t1A9F866D1A83C5640098BE6C /* SoundPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A9F866C1A83C5640098BE6C /* SoundPlayer.swift */; };\n\t\t1AA7E1831AA36EFF00762D75 /* AsyncImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AA7E1811AA36EFF00762D75 /* AsyncImageView.swift */; };\n\t\t1AA7E1841AA36EFF00762D75 /* AsyncButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AA7E1821AA36EFF00762D75 /* AsyncButton.swift */; };\n\t\t1AB764641A6E4F070076CD78 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 964117471A5BE90A000E3A5A /* Images.xcassets */; };\n\t\t964117411A5BE90A000E3A5A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 964117401A5BE90A000E3A5A /* AppDelegate.swift */; };\n\t\t964117461A5BE90A000E3A5A /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 964117441A5BE90A000E3A5A /* Main.storyboard */; };\n\t\t964117481A5BE90A000E3A5A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 964117471A5BE90A000E3A5A /* Images.xcassets */; };\n\t\t9641174B1A5BE90A000E3A5A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 964117491A5BE90A000E3A5A /* LaunchScreen.xib */; };\n\t\t964117571A5BE90A000E3A5A /* SpringAppTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 964117561A5BE90A000E3A5A /* SpringAppTests.swift */; };\n\t\t9641178B1A5BEC6F000E3A5A /* SpringViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 964117881A5BEC6F000E3A5A /* SpringViewController.swift */; };\n\t\t9641178C1A5BEC6F000E3A5A /* OptionsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 964117891A5BEC6F000E3A5A /* OptionsViewController.swift */; };\n\t\t9641178D1A5BEC6F000E3A5A /* CodeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9641178A1A5BEC6F000E3A5A /* CodeViewController.swift */; };\n\t\t96C5F4621AC464C800BB8A18 /* AutoTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96C5F4611AC464C800BB8A18 /* AutoTextView.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t1A4FDA3F1A6E44780099D309 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 964117331A5BE90A000E3A5A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 1A4FDA321A6E44780099D309;\n\t\t\tremoteInfo = Spring;\n\t\t};\n\t\t1A4FDA411A6E44780099D309 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 964117331A5BE90A000E3A5A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 9641173A1A5BE90A000E3A5A;\n\t\t\tremoteInfo = SpringApp;\n\t\t};\n\t\t1A4FDA481A6E44780099D309 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 964117331A5BE90A000E3A5A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 1A4FDA321A6E44780099D309;\n\t\t\tremoteInfo = Spring;\n\t\t};\n\t\t964117511A5BE90A000E3A5A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 964117331A5BE90A000E3A5A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 9641173A1A5BE90A000E3A5A;\n\t\t\tremoteInfo = SpringApp;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t1A4FDA4F1A6E44780099D309 /* 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\t1A4FDA4B1A6E44780099D309 /* Spring.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\t1A4FDA2A1A6E44270099D309 /* LoadingView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoadingView.swift; sourceTree = \"<group>\"; };\n\t\t1A4FDA2B1A6E44270099D309 /* LoadingView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LoadingView.xib; sourceTree = \"<group>\"; };\n\t\t1A4FDA331A6E44780099D309 /* Spring.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Spring.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t1A4FDA361A6E44780099D309 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t1A4FDA371A6E44780099D309 /* Spring.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Spring.h; sourceTree = \"<group>\"; };\n\t\t1A4FDA3D1A6E44780099D309 /* SpringTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SpringTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t1A4FDA451A6E44780099D309 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t1A4FDA461A6E44780099D309 /* SpringTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpringTests.swift; sourceTree = \"<group>\"; };\n\t\t1A585F3F1A7B9530007EEB7D /* KeyboardLayoutConstraint.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyboardLayoutConstraint.swift; sourceTree = \"<group>\"; };\n\t\t1A9F866C1A83C5640098BE6C /* SoundPlayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SoundPlayer.swift; sourceTree = \"<group>\"; };\n\t\t1AA7E1811AA36EFF00762D75 /* AsyncImageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AsyncImageView.swift; sourceTree = \"<group>\"; };\n\t\t1AA7E1821AA36EFF00762D75 /* AsyncButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AsyncButton.swift; sourceTree = \"<group>\"; };\n\t\t1AD08AC61A676D5800160D45 /* Spring.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Spring.swift; sourceTree = \"<group>\"; };\n\t\t1AF3F11A1A6776760090E8F9 /* SpringImageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpringImageView.swift; sourceTree = \"<group>\"; };\n\t\t1AF3F11B1A6776760090E8F9 /* SpringLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpringLabel.swift; sourceTree = \"<group>\"; };\n\t\t1AF3F11C1A6776760090E8F9 /* SpringTextField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpringTextField.swift; sourceTree = \"<group>\"; };\n\t\t1AF3F11D1A6776760090E8F9 /* SpringTextView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpringTextView.swift; sourceTree = \"<group>\"; };\n\t\t961888D31A66BF9000295A64 /* BlurView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BlurView.swift; sourceTree = \"<group>\"; };\n\t\t961888D51A66BF9000295A64 /* DesignableButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DesignableButton.swift; sourceTree = \"<group>\"; };\n\t\t961888D61A66BF9000295A64 /* DesignableImageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DesignableImageView.swift; sourceTree = \"<group>\"; };\n\t\t961888D71A66BF9000295A64 /* DesignableLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DesignableLabel.swift; sourceTree = \"<group>\"; };\n\t\t961888D81A66BF9000295A64 /* DesignableTextField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DesignableTextField.swift; sourceTree = \"<group>\"; };\n\t\t961888D91A66BF9000295A64 /* DesignableTextView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DesignableTextView.swift; sourceTree = \"<group>\"; };\n\t\t961888DA1A66BF9000295A64 /* DesignableView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DesignableView.swift; sourceTree = \"<group>\"; };\n\t\t961888DB1A66BF9000295A64 /* ImageLoader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageLoader.swift; sourceTree = \"<group>\"; };\n\t\t961888DF1A66BF9000295A64 /* Misc.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Misc.swift; sourceTree = \"<group>\"; };\n\t\t961888E01A66BF9000295A64 /* SpringAnimation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpringAnimation.swift; sourceTree = \"<group>\"; };\n\t\t961888E11A66BF9000295A64 /* SpringButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpringButton.swift; sourceTree = \"<group>\"; };\n\t\t961888E21A66BF9000295A64 /* SpringView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpringView.swift; sourceTree = \"<group>\"; };\n\t\t961888E31A66BF9000295A64 /* TransitionManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransitionManager.swift; sourceTree = \"<group>\"; };\n\t\t961888E41A66BF9000295A64 /* TransitionZoom.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransitionZoom.swift; sourceTree = \"<group>\"; };\n\t\t961888E51A66BF9000295A64 /* UnwindSegue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnwindSegue.swift; sourceTree = \"<group>\"; };\n\t\t9641173B1A5BE90A000E3A5A /* SpringApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SpringApp.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t9641173F1A5BE90A000E3A5A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t964117401A5BE90A000E3A5A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t964117451A5BE90A000E3A5A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t964117471A5BE90A000E3A5A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = \"<group>\"; };\n\t\t9641174A1A5BE90A000E3A5A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = \"<group>\"; };\n\t\t964117501A5BE90A000E3A5A /* SpringAppTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SpringAppTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t964117551A5BE90A000E3A5A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t964117561A5BE90A000E3A5A /* SpringAppTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpringAppTests.swift; sourceTree = \"<group>\"; };\n\t\t964117881A5BEC6F000E3A5A /* SpringViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpringViewController.swift; sourceTree = \"<group>\"; };\n\t\t964117891A5BEC6F000E3A5A /* OptionsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OptionsViewController.swift; sourceTree = \"<group>\"; };\n\t\t9641178A1A5BEC6F000E3A5A /* CodeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CodeViewController.swift; sourceTree = \"<group>\"; };\n\t\t969775D31A6AD6AC009B4B79 /* DesignableTabBarController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DesignableTabBarController.swift; sourceTree = \"<group>\"; };\n\t\t96C5F4611AC464C800BB8A18 /* AutoTextView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AutoTextView.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t1A4FDA2F1A6E44780099D309 /* 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\t1A4FDA3A1A6E44780099D309 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1A4FDA3E1A6E44780099D309 /* Spring.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t964117381A5BE90A000E3A5A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1A4FDA4A1A6E44780099D309 /* Spring.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t9641174D1A5BE90A000E3A5A /* 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\t1A4FDA341A6E44780099D309 /* Spring */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1A4FDA371A6E44780099D309 /* Spring.h */,\n\t\t\t\t1A4FDA351A6E44780099D309 /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = Spring;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1A4FDA351A6E44780099D309 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1A4FDA361A6E44780099D309 /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1A4FDA431A6E44780099D309 /* SpringTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1A4FDA461A6E44780099D309 /* SpringTests.swift */,\n\t\t\t\t1A4FDA441A6E44780099D309 /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = SpringTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1A4FDA441A6E44780099D309 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1A4FDA451A6E44780099D309 /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t961888D21A66BF9000295A64 /* Spring */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1AA7E1821AA36EFF00762D75 /* AsyncButton.swift */,\n\t\t\t\t1AA7E1811AA36EFF00762D75 /* AsyncImageView.swift */,\n\t\t\t\t96C5F4611AC464C800BB8A18 /* AutoTextView.swift */,\n\t\t\t\t1A4FDA2A1A6E44270099D309 /* LoadingView.swift */,\n\t\t\t\t1A4FDA2B1A6E44270099D309 /* LoadingView.xib */,\n\t\t\t\t961888D31A66BF9000295A64 /* BlurView.swift */,\n\t\t\t\t961888D51A66BF9000295A64 /* DesignableButton.swift */,\n\t\t\t\t961888D61A66BF9000295A64 /* DesignableImageView.swift */,\n\t\t\t\t961888D71A66BF9000295A64 /* DesignableLabel.swift */,\n\t\t\t\t961888D81A66BF9000295A64 /* DesignableTextField.swift */,\n\t\t\t\t961888D91A66BF9000295A64 /* DesignableTextView.swift */,\n\t\t\t\t961888DA1A66BF9000295A64 /* DesignableView.swift */,\n\t\t\t\t969775D31A6AD6AC009B4B79 /* DesignableTabBarController.swift */,\n\t\t\t\t961888DB1A66BF9000295A64 /* ImageLoader.swift */,\n\t\t\t\t1A585F3F1A7B9530007EEB7D /* KeyboardLayoutConstraint.swift */,\n\t\t\t\t961888DF1A66BF9000295A64 /* Misc.swift */,\n\t\t\t\t1A9F866C1A83C5640098BE6C /* SoundPlayer.swift */,\n\t\t\t\t1AD08AC61A676D5800160D45 /* Spring.swift */,\n\t\t\t\t961888E01A66BF9000295A64 /* SpringAnimation.swift */,\n\t\t\t\t961888E11A66BF9000295A64 /* SpringButton.swift */,\n\t\t\t\t1AF3F11A1A6776760090E8F9 /* SpringImageView.swift */,\n\t\t\t\t1AF3F11B1A6776760090E8F9 /* SpringLabel.swift */,\n\t\t\t\t1AF3F11C1A6776760090E8F9 /* SpringTextField.swift */,\n\t\t\t\t1AF3F11D1A6776760090E8F9 /* SpringTextView.swift */,\n\t\t\t\t961888E21A66BF9000295A64 /* SpringView.swift */,\n\t\t\t\t961888E31A66BF9000295A64 /* TransitionManager.swift */,\n\t\t\t\t961888E41A66BF9000295A64 /* TransitionZoom.swift */,\n\t\t\t\t961888E51A66BF9000295A64 /* UnwindSegue.swift */,\n\t\t\t);\n\t\t\tpath = Spring;\n\t\t\tsourceTree = SOURCE_ROOT;\n\t\t};\n\t\t964117321A5BE90A000E3A5A = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9641173D1A5BE90A000E3A5A /* SpringApp */,\n\t\t\t\t964117531A5BE90A000E3A5A /* SpringAppTests */,\n\t\t\t\t1A4FDA341A6E44780099D309 /* Spring */,\n\t\t\t\t1A4FDA431A6E44780099D309 /* SpringTests */,\n\t\t\t\t9641173C1A5BE90A000E3A5A /* Products */,\n\t\t\t);\n\t\t\tindentWidth = 4;\n\t\t\tsourceTree = \"<group>\";\n\t\t\ttabWidth = 4;\n\t\t};\n\t\t9641173C1A5BE90A000E3A5A /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9641173B1A5BE90A000E3A5A /* SpringApp.app */,\n\t\t\t\t964117501A5BE90A000E3A5A /* SpringAppTests.xctest */,\n\t\t\t\t1A4FDA331A6E44780099D309 /* Spring.framework */,\n\t\t\t\t1A4FDA3D1A6E44780099D309 /* SpringTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9641173D1A5BE90A000E3A5A /* SpringApp */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t961888D21A66BF9000295A64 /* Spring */,\n\t\t\t\t964117401A5BE90A000E3A5A /* AppDelegate.swift */,\n\t\t\t\t964117881A5BEC6F000E3A5A /* SpringViewController.swift */,\n\t\t\t\t964117891A5BEC6F000E3A5A /* OptionsViewController.swift */,\n\t\t\t\t9641178A1A5BEC6F000E3A5A /* CodeViewController.swift */,\n\t\t\t\t964117441A5BE90A000E3A5A /* Main.storyboard */,\n\t\t\t\t964117471A5BE90A000E3A5A /* Images.xcassets */,\n\t\t\t\t964117491A5BE90A000E3A5A /* LaunchScreen.xib */,\n\t\t\t\t9641173E1A5BE90A000E3A5A /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = SpringApp;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9641173E1A5BE90A000E3A5A /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9641173F1A5BE90A000E3A5A /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t964117531A5BE90A000E3A5A /* SpringAppTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t964117561A5BE90A000E3A5A /* SpringAppTests.swift */,\n\t\t\t\t964117541A5BE90A000E3A5A /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = SpringAppTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t964117541A5BE90A000E3A5A /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t964117551A5BE90A000E3A5A /* 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\t1A4FDA301A6E44780099D309 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1A4FDA381A6E44780099D309 /* Spring.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\t1A4FDA321A6E44780099D309 /* Spring */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 1A4FDA4C1A6E44780099D309 /* Build configuration list for PBXNativeTarget \"Spring\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t1A4FDA2E1A6E44780099D309 /* Sources */,\n\t\t\t\t1A4FDA2F1A6E44780099D309 /* Frameworks */,\n\t\t\t\t1A4FDA301A6E44780099D309 /* Headers */,\n\t\t\t\t1A4FDA311A6E44780099D309 /* 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 = Spring;\n\t\t\tproductName = Spring;\n\t\t\tproductReference = 1A4FDA331A6E44780099D309 /* Spring.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t1A4FDA3C1A6E44780099D309 /* SpringTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 1A4FDA501A6E44780099D309 /* Build configuration list for PBXNativeTarget \"SpringTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t1A4FDA391A6E44780099D309 /* Sources */,\n\t\t\t\t1A4FDA3A1A6E44780099D309 /* Frameworks */,\n\t\t\t\t1A4FDA3B1A6E44780099D309 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t1A4FDA401A6E44780099D309 /* PBXTargetDependency */,\n\t\t\t\t1A4FDA421A6E44780099D309 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = SpringTests;\n\t\t\tproductName = SpringTests;\n\t\t\tproductReference = 1A4FDA3D1A6E44780099D309 /* SpringTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\t9641173A1A5BE90A000E3A5A /* SpringApp */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 9641175A1A5BE90A000E3A5A /* Build configuration list for PBXNativeTarget \"SpringApp\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t964117371A5BE90A000E3A5A /* Sources */,\n\t\t\t\t964117381A5BE90A000E3A5A /* Frameworks */,\n\t\t\t\t964117391A5BE90A000E3A5A /* Resources */,\n\t\t\t\t1A4FDA4F1A6E44780099D309 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t1A4FDA491A6E44780099D309 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = SpringApp;\n\t\t\tproductName = SpringApp;\n\t\t\tproductReference = 9641173B1A5BE90A000E3A5A /* SpringApp.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t9641174F1A5BE90A000E3A5A /* SpringAppTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 9641175D1A5BE90A000E3A5A /* Build configuration list for PBXNativeTarget \"SpringAppTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t9641174C1A5BE90A000E3A5A /* Sources */,\n\t\t\t\t9641174D1A5BE90A000E3A5A /* Frameworks */,\n\t\t\t\t9641174E1A5BE90A000E3A5A /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t964117521A5BE90A000E3A5A /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = SpringAppTests;\n\t\t\tproductName = SpringAppTests;\n\t\t\tproductReference = 964117501A5BE90A000E3A5A /* SpringAppTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t964117331A5BE90A000E3A5A /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0700;\n\t\t\t\tLastUpgradeCheck = 0900;\n\t\t\t\tORGANIZATIONNAME = \"Meng To\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t1A4FDA321A6E44780099D309 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.1.1;\n\t\t\t\t\t\tLastSwiftMigration = 1020;\n\t\t\t\t\t};\n\t\t\t\t\t1A4FDA3C1A6E44780099D309 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.1.1;\n\t\t\t\t\t\tLastSwiftMigration = 1020;\n\t\t\t\t\t\tTestTargetID = 9641173A1A5BE90A000E3A5A;\n\t\t\t\t\t};\n\t\t\t\t\t9641173A1A5BE90A000E3A5A = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.2;\n\t\t\t\t\t\tLastSwiftMigration = 1020;\n\t\t\t\t\t};\n\t\t\t\t\t9641174F1A5BE90A000E3A5A = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.2;\n\t\t\t\t\t\tLastSwiftMigration = 1020;\n\t\t\t\t\t\tTestTargetID = 9641173A1A5BE90A000E3A5A;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 964117361A5BE90A000E3A5A /* Build configuration list for PBXProject \"SpringApp\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\tEnglish,\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 964117321A5BE90A000E3A5A;\n\t\t\tproductRefGroup = 9641173C1A5BE90A000E3A5A /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t9641173A1A5BE90A000E3A5A /* SpringApp */,\n\t\t\t\t9641174F1A5BE90A000E3A5A /* SpringAppTests */,\n\t\t\t\t1A4FDA321A6E44780099D309 /* Spring */,\n\t\t\t\t1A4FDA3C1A6E44780099D309 /* SpringTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t1A4FDA311A6E44780099D309 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1AB764641A6E4F070076CD78 /* Images.xcassets in Resources */,\n\t\t\t\t1A4FDA541A6E44A70099D309 /* LoadingView.xib in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t1A4FDA3B1A6E44780099D309 /* 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\t964117391A5BE90A000E3A5A /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t964117461A5BE90A000E3A5A /* Main.storyboard in Resources */,\n\t\t\t\t9641174B1A5BE90A000E3A5A /* LaunchScreen.xib in Resources */,\n\t\t\t\t964117481A5BE90A000E3A5A /* Images.xcassets in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t9641174E1A5BE90A000E3A5A /* 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\t1A4FDA2E1A6E44780099D309 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1A4FDA531A6E44A70099D309 /* LoadingView.swift in Sources */,\n\t\t\t\t1A4FDA5B1A6E44A70099D309 /* DesignableTextView.swift in Sources */,\n\t\t\t\t1A4FDA671A6E44A70099D309 /* SpringTextView.swift in Sources */,\n\t\t\t\t1A4FDA641A6E44A70099D309 /* SpringImageView.swift in Sources */,\n\t\t\t\t1A4FDA581A6E44A70099D309 /* DesignableImageView.swift in Sources */,\n\t\t\t\t1A4FDA601A6E44A70099D309 /* Misc.swift in Sources */,\n\t\t\t\t1A4FDA611A6E44A70099D309 /* Spring.swift in Sources */,\n\t\t\t\t1A4FDA5A1A6E44A70099D309 /* DesignableTextField.swift in Sources */,\n\t\t\t\t1A4FDA691A6E44A70099D309 /* TransitionManager.swift in Sources */,\n\t\t\t\t1A4FDA5E1A6E44A70099D309 /* ImageLoader.swift in Sources */,\n\t\t\t\t1A9F866D1A83C5640098BE6C /* SoundPlayer.swift in Sources */,\n\t\t\t\t1A4FDA551A6E44A70099D309 /* BlurView.swift in Sources */,\n\t\t\t\t1AA7E1841AA36EFF00762D75 /* AsyncButton.swift in Sources */,\n\t\t\t\t1A4FDA5D1A6E44A70099D309 /* DesignableTabBarController.swift in Sources */,\n\t\t\t\t1A4FDA591A6E44A70099D309 /* DesignableLabel.swift in Sources */,\n\t\t\t\t1A4FDA661A6E44A70099D309 /* SpringTextField.swift in Sources */,\n\t\t\t\t1A4FDA631A6E44A70099D309 /* SpringButton.swift in Sources */,\n\t\t\t\t1A4FDA621A6E44A70099D309 /* SpringAnimation.swift in Sources */,\n\t\t\t\t1A585F401A7B9530007EEB7D /* KeyboardLayoutConstraint.swift in Sources */,\n\t\t\t\t1AA7E1831AA36EFF00762D75 /* AsyncImageView.swift in Sources */,\n\t\t\t\t1A4FDA6B1A6E44A70099D309 /* UnwindSegue.swift in Sources */,\n\t\t\t\t1A4FDA681A6E44A70099D309 /* SpringView.swift in Sources */,\n\t\t\t\t1A4FDA6A1A6E44A70099D309 /* TransitionZoom.swift in Sources */,\n\t\t\t\t1A4FDA651A6E44A70099D309 /* SpringLabel.swift in Sources */,\n\t\t\t\t1A4FDA571A6E44A70099D309 /* DesignableButton.swift in Sources */,\n\t\t\t\t1A4FDA5C1A6E44A70099D309 /* DesignableView.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t1A4FDA391A6E44780099D309 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1A4FDA471A6E44780099D309 /* SpringTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t964117371A5BE90A000E3A5A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t964117411A5BE90A000E3A5A /* AppDelegate.swift in Sources */,\n\t\t\t\t9641178D1A5BEC6F000E3A5A /* CodeViewController.swift in Sources */,\n\t\t\t\t9641178C1A5BEC6F000E3A5A /* OptionsViewController.swift in Sources */,\n\t\t\t\t9641178B1A5BEC6F000E3A5A /* SpringViewController.swift in Sources */,\n\t\t\t\t96C5F4621AC464C800BB8A18 /* AutoTextView.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t9641174C1A5BE90A000E3A5A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t964117571A5BE90A000E3A5A /* SpringAppTests.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\t1A4FDA401A6E44780099D309 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 1A4FDA321A6E44780099D309 /* Spring */;\n\t\t\ttargetProxy = 1A4FDA3F1A6E44780099D309 /* PBXContainerItemProxy */;\n\t\t};\n\t\t1A4FDA421A6E44780099D309 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 9641173A1A5BE90A000E3A5A /* SpringApp */;\n\t\t\ttargetProxy = 1A4FDA411A6E44780099D309 /* PBXContainerItemProxy */;\n\t\t};\n\t\t1A4FDA491A6E44780099D309 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 1A4FDA321A6E44780099D309 /* Spring */;\n\t\t\ttargetProxy = 1A4FDA481A6E44780099D309 /* PBXContainerItemProxy */;\n\t\t};\n\t\t964117521A5BE90A000E3A5A /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 9641173A1A5BE90A000E3A5A /* SpringApp */;\n\t\t\ttargetProxy = 964117511A5BE90A000E3A5A /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t964117441A5BE90A000E3A5A /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t964117451A5BE90A000E3A5A /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t964117491A5BE90A000E3A5A /* LaunchScreen.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t9641174A1A5BE90A000E3A5A /* 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\t1A4FDA4D1A6E44780099D309 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\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 = Spring/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"designcode.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\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\t1A4FDA4E1A6E44780099D309 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\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 = Spring/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"designcode.$(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 = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\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\t\t1A4FDA511A6E44780099D309 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\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 = SpringTests/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.1;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.jamztang.$(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)/SpringApp.app/SpringApp\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1A4FDA521A6E44780099D309 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tINFOPLIST_FILE = SpringTests/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.1;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.jamztang.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/SpringApp.app/SpringApp\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t964117581A5BE90A000E3A5A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\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_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_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\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.2;\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_SWIFT3_OBJC_INFERENCE = Off;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t964117591A5BE90A000E3A5A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\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_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_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 = YES;\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.2;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Off;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t9641175B1A5BE90A000E3A5A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tINFOPLIST_FILE = SpringApp/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"designcode.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t9641175C1A5BE90A000E3A5A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tINFOPLIST_FILE = SpringApp/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"designcode.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t9641175E1A5BE90A000E3A5A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\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 = SpringAppTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"designcode.$(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)/SpringApp.app/SpringApp\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t9641175F1A5BE90A000E3A5A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tINFOPLIST_FILE = SpringAppTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"designcode.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/SpringApp.app/SpringApp\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t1A4FDA4C1A6E44780099D309 /* Build configuration list for PBXNativeTarget \"Spring\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1A4FDA4D1A6E44780099D309 /* Debug */,\n\t\t\t\t1A4FDA4E1A6E44780099D309 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t1A4FDA501A6E44780099D309 /* Build configuration list for PBXNativeTarget \"SpringTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1A4FDA511A6E44780099D309 /* Debug */,\n\t\t\t\t1A4FDA521A6E44780099D309 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t964117361A5BE90A000E3A5A /* Build configuration list for PBXProject \"SpringApp\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t964117581A5BE90A000E3A5A /* Debug */,\n\t\t\t\t964117591A5BE90A000E3A5A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t9641175A1A5BE90A000E3A5A /* Build configuration list for PBXNativeTarget \"SpringApp\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t9641175B1A5BE90A000E3A5A /* Debug */,\n\t\t\t\t9641175C1A5BE90A000E3A5A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t9641175D1A5BE90A000E3A5A /* Build configuration list for PBXNativeTarget \"SpringAppTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t9641175E1A5BE90A000E3A5A /* Debug */,\n\t\t\t\t9641175F1A5BE90A000E3A5A /* 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 = 964117331A5BE90A000E3A5A /* Project object */;\n}\n"
  },
  {
    "path": "SpringApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:SpringApp.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "SpringApp.xcodeproj/xcshareddata/xcschemes/Spring.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\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 = \"1A4FDA321A6E44780099D309\"\n               BuildableName = \"Spring.framework\"\n               BlueprintName = \"Spring\"\n               ReferencedContainer = \"container:SpringApp.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      <AdditionalOptions>\n      </AdditionalOptions>\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 = \"1A4FDA321A6E44780099D309\"\n            BuildableName = \"Spring.framework\"\n            BlueprintName = \"Spring\"\n            ReferencedContainer = \"container:SpringApp.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\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 = \"1A4FDA321A6E44780099D309\"\n            BuildableName = \"Spring.framework\"\n            BlueprintName = \"Spring\"\n            ReferencedContainer = \"container:SpringApp.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": "SpringApp.xcodeproj/xcshareddata/xcschemes/SpringApp.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\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 = \"9641173A1A5BE90A000E3A5A\"\n               BuildableName = \"SpringApp.app\"\n               BlueprintName = \"SpringApp\"\n               ReferencedContainer = \"container:SpringApp.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"9641174F1A5BE90A000E3A5A\"\n               BuildableName = \"SpringAppTests.xctest\"\n               BlueprintName = \"SpringAppTests\"\n               ReferencedContainer = \"container:SpringApp.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"1A4FDA3C1A6E44780099D309\"\n               BuildableName = \"SpringTests.xctest\"\n               BlueprintName = \"SpringTests\"\n               ReferencedContainer = \"container:SpringApp.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         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"9641174F1A5BE90A000E3A5A\"\n               BuildableName = \"SpringAppTests.xctest\"\n               BlueprintName = \"SpringAppTests\"\n               ReferencedContainer = \"container:SpringApp.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"1A4FDA3C1A6E44780099D309\"\n               BuildableName = \"SpringTests.xctest\"\n               BlueprintName = \"SpringTests\"\n               ReferencedContainer = \"container:SpringApp.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"9641173A1A5BE90A000E3A5A\"\n            BuildableName = \"SpringApp.app\"\n            BlueprintName = \"SpringApp\"\n            ReferencedContainer = \"container:SpringApp.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\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      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"9641173A1A5BE90A000E3A5A\"\n            BuildableName = \"SpringApp.app\"\n            BlueprintName = \"SpringApp\"\n            ReferencedContainer = \"container:SpringApp.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"9641173A1A5BE90A000E3A5A\"\n            BuildableName = \"SpringApp.app\"\n            BlueprintName = \"SpringApp\"\n            ReferencedContainer = \"container:SpringApp.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "SpringAppTests/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": "SpringAppTests/SpringAppTests.swift",
    "content": "//\n//  SpringAppTests.swift\n//  SpringAppTests\n//\n//  Created by Meng To on 2015-01-06.\n//  Copyright (c) 2015 Meng To. All rights reserved.\n//\n\nimport UIKit\nimport XCTest\n\nclass SpringAppTests: 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": "SpringTests/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": "SpringTests/SpringTests.swift",
    "content": "//\n//  SpringTests.swift\n//  SpringTests\n//\n//  Created by James Tang on 20/1/15.\n//  Copyright (c) 2015 Meng To. All rights reserved.\n//\n\nimport UIKit\nimport XCTest\n\nclass SpringTests: 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"
  }
]