master 9777b047a904 cached
100 files
615.7 KB
148.9k tokens
100 symbols
1 requests
Download .txt
Showing preview only (652K chars total). Download the full file or copy to clipboard to get everything.
Repository: ninjaprox/NVActivityIndicatorView
Branch: master
Commit: 9777b047a904
Files: 100
Total size: 615.7 KB

Directory structure:
gitextract_aoakydhx/

├── .github/
│   └── workflows/
│       └── ios.yml
├── .gitignore
├── .jazzy.yaml
├── .swiftlint.yml
├── CHANGELOG.md
├── Example/
│   ├── AppDelegate.swift
│   ├── Assets.xcassets/
│   │   ├── AppIcon.appiconset/
│   │   │   └── Contents.json
│   │   └── Contents.json
│   ├── Base.lproj/
│   │   ├── LaunchScreen.storyboard
│   │   └── Main.storyboard
│   ├── Info.plist
│   ├── SceneDelegate.swift
│   └── ViewController.swift
├── LICENSE
├── NVActivityIndicatorView.podspec
├── NVActivityIndicatorView.xcodeproj/
│   ├── NVActivityIndicatorViewExtended_Info.plist
│   ├── NVActivityIndicatorView_Info.plist
│   ├── project.pbxproj
│   ├── project.xcworkspace/
│   │   ├── contents.xcworkspacedata
│   │   └── xcshareddata/
│   │       ├── IDEWorkspaceChecks.plist
│   │       ├── WorkspaceSettings.xcsettings
│   │       └── swiftpm/
│   │           └── Package.resolved
│   └── xcshareddata/
│       └── xcschemes/
│           ├── Example.xcscheme
│           └── NVActivityIndicatorView-Package.xcscheme
├── Package.swift
├── PrivacyInfo.xcprivacy
├── README.md
├── Sources/
│   ├── Base/
│   │   ├── Animations/
│   │   │   ├── NVActivityIndicatorAnimationAudioEqualizer.swift
│   │   │   ├── NVActivityIndicatorAnimationBallBeat.swift
│   │   │   ├── NVActivityIndicatorAnimationBallClipRotate.swift
│   │   │   ├── NVActivityIndicatorAnimationBallClipRotateMultiple.swift
│   │   │   ├── NVActivityIndicatorAnimationBallClipRotatePulse.swift
│   │   │   ├── NVActivityIndicatorAnimationBallDoubleBounce.swift
│   │   │   ├── NVActivityIndicatorAnimationBallGridBeat.swift
│   │   │   ├── NVActivityIndicatorAnimationBallGridPulse.swift
│   │   │   ├── NVActivityIndicatorAnimationBallPulse.swift
│   │   │   ├── NVActivityIndicatorAnimationBallPulseRise.swift
│   │   │   ├── NVActivityIndicatorAnimationBallPulseSync.swift
│   │   │   ├── NVActivityIndicatorAnimationBallRotate.swift
│   │   │   ├── NVActivityIndicatorAnimationBallRotateChase.swift
│   │   │   ├── NVActivityIndicatorAnimationBallScale.swift
│   │   │   ├── NVActivityIndicatorAnimationBallScaleMultiple.swift
│   │   │   ├── NVActivityIndicatorAnimationBallScaleRipple.swift
│   │   │   ├── NVActivityIndicatorAnimationBallScaleRippleMultiple.swift
│   │   │   ├── NVActivityIndicatorAnimationBallSpinFadeLoader.swift
│   │   │   ├── NVActivityIndicatorAnimationBallTrianglePath.swift
│   │   │   ├── NVActivityIndicatorAnimationBallZigZag.swift
│   │   │   ├── NVActivityIndicatorAnimationBallZigZagDeflect.swift
│   │   │   ├── NVActivityIndicatorAnimationBlank.swift
│   │   │   ├── NVActivityIndicatorAnimationCircleStrokeSpin.swift
│   │   │   ├── NVActivityIndicatorAnimationCubeTransition.swift
│   │   │   ├── NVActivityIndicatorAnimationLineScale.swift
│   │   │   ├── NVActivityIndicatorAnimationLineScaleParty.swift
│   │   │   ├── NVActivityIndicatorAnimationLineScalePulseOut.swift
│   │   │   ├── NVActivityIndicatorAnimationLineScalePulseOutRapid.swift
│   │   │   ├── NVActivityIndicatorAnimationLineSpinFadeLoader.swift
│   │   │   ├── NVActivityIndicatorAnimationOrbit.swift
│   │   │   ├── NVActivityIndicatorAnimationPacman.swift
│   │   │   ├── NVActivityIndicatorAnimationSemiCircleSpin.swift
│   │   │   ├── NVActivityIndicatorAnimationSquareSpin.swift
│   │   │   └── NVActivityIndicatorAnimationTriangleSkewSpin.swift
│   │   ├── NVActivityIndicatorAnimationDelegate.swift
│   │   ├── NVActivityIndicatorShape.swift
│   │   └── NVActivityIndicatorView.swift
│   └── Extended/
│       ├── NVActivityIndicatorPresenter.swift
│       └── NVActivityIndicatorViewable.swift
├── Tests/
│   ├── ActivityDataTests.swift
│   ├── Info.plist
│   ├── NVActivityIndicatorPresenterTests.swift
│   ├── NVActivityIndicatorTypeTests.swift
│   ├── NVActivityIndicatorViewTests.swift
│   └── Tests-Bridging-Header.h
├── docs/
│   ├── CNAME
│   ├── Classes/
│   │   └── NVActivityIndicatorView.html
│   ├── Classes.html
│   ├── Enums/
│   │   └── NVActivityIndicatorType.html
│   ├── Enums.html
│   ├── Typealiases.html
│   ├── css/
│   │   ├── highlight.css
│   │   └── jazzy.css
│   ├── docsets/
│   │   ├── NVActivityIndicatorView.docset/
│   │   │   └── Contents/
│   │   │       ├── Info.plist
│   │   │       └── Resources/
│   │   │           ├── Documents/
│   │   │           │   ├── Classes/
│   │   │           │   │   └── NVActivityIndicatorView.html
│   │   │           │   ├── Classes.html
│   │   │           │   ├── Enums/
│   │   │           │   │   └── NVActivityIndicatorType.html
│   │   │           │   ├── Enums.html
│   │   │           │   ├── Typealiases.html
│   │   │           │   ├── css/
│   │   │           │   │   ├── highlight.css
│   │   │           │   │   └── jazzy.css
│   │   │           │   ├── index.html
│   │   │           │   └── js/
│   │   │           │       ├── jazzy.js
│   │   │           │       ├── jazzy.search.js
│   │   │           │       └── typeahead.jquery.js
│   │   │           └── docSet.dsidx
│   │   └── NVActivityIndicatorView.tgz
│   ├── index.html
│   ├── js/
│   │   ├── jazzy.js
│   │   ├── jazzy.search.js
│   │   └── typeahead.jquery.js
│   └── undocumented.json
└── scripts/
    └── bump-version.sh

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/workflows/ios.yml
================================================
name: iOS starter workflow

on:
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "master" ]

jobs:
  build:
    name: Build and Test default scheme using any available iPhone simulator
    runs-on: macos-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Set Default Scheme
        run: |
          scheme_list=$(xcodebuild -list -json | tr -d "\n")
          default=$(echo $scheme_list | ruby -e "require 'json'; puts JSON.parse(STDIN.gets)['project']['schemes'][0]")
          echo $default | cat >default
          echo Using default scheme: $default
      - name: Build
        env:
          scheme: ${{ 'default' }}
          platform: ${{ 'iOS Simulator' }}
        run: |
          # xcrun xctrace returns via stderr, not the expected stdout (see https://developer.apple.com/forums/thread/663959)
          device=`xcrun xctrace list devices 2>&1 | grep -oE 'iPhone.*?[^\(]+' | head -1 | awk '{$1=$1;print}' | sed -e "s/ Simulator$//"`
          if [ $scheme = default ]; then scheme=$(cat default); fi
          if [ "`ls -A | grep -i \\.xcworkspace\$`" ]; then filetype_parameter="workspace" && file_to_build="`ls -A | grep -i \\.xcworkspace\$`"; else filetype_parameter="project" && file_to_build="`ls -A | grep -i \\.xcodeproj\$`"; fi
          file_to_build=`echo $file_to_build | awk '{$1=$1;print}'`
          xcodebuild build-for-testing -scheme "$scheme" -"$filetype_parameter" "$file_to_build" -destination "platform=$platform,name=$device" -skipPackagePluginValidation -skipMacroValidation
      - name: Test
        env:
          scheme: ${{ 'default' }}
          platform: ${{ 'iOS Simulator' }}
        run: |
          # xcrun xctrace returns via stderr, not the expected stdout (see https://developer.apple.com/forums/thread/663959)
          device=`xcrun xctrace list devices 2>&1 | grep -oE 'iPhone.*?[^\(]+' | head -1 | awk '{$1=$1;print}' | sed -e "s/ Simulator$//"`
          if [ $scheme = default ]; then scheme=$(cat default); fi
          if [ "`ls -A | grep -i \\.xcworkspace\$`" ]; then filetype_parameter="workspace" && file_to_build="`ls -A | grep -i \\.xcworkspace\$`"; else filetype_parameter="project" && file_to_build="`ls -A | grep -i \\.xcodeproj\$`"; fi
          file_to_build=`echo $file_to_build | awk '{$1=$1;print}'`
          xcodebuild test-without-building -scheme "$scheme" -"$filetype_parameter" "$file_to_build" -destination "platform=$platform,name=$device"


================================================
FILE: .gitignore
================================================
# General
.DS_Store
.AppleDouble
.LSOverride

# Icon must end with two \r
Icon

# Thumbnails
._*

# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent

# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk

# Xcode
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore

## User settings
xcuserdata/

## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
*.xcscmblueprint
*.xccheckout

## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
build/
DerivedData/
*.moved-aside
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3

## Obj-C/Swift specific
*.hmap

## App packaging
*.ipa
*.dSYM.zip
*.dSYM

## Playgrounds
timeline.xctimeline
playground.xcworkspace

# Swift Package Manager
#
# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
# Packages/
# Package.pins
# Package.resolved
# *.xcodeproj
#
# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
# hence it is not needed unless you have added a package configuration file to your project
.swiftpm

.build/

# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
#
# Pods/
#
# Add this line if you want to avoid checking in source code from the Xcode workspace
# *.xcworkspace

# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts

Carthage/Build/

# Accio dependency management
Dependencies/
.accio/

# fastlane
#
# It is recommended to not store the screenshots in the git repo.
# Instead, use fastlane to re-generate the screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://docs.fastlane.tools/best-practices/source-control/#source-control

fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots/**/*.png
fastlane/test_output

# Code Injection
#
# After new code Injection tools there's a generated folder /iOSInjectionProject
# https://github.com/johnno1962/injectionforxcode

iOSInjectionProject/


================================================
FILE: .jazzy.yaml
================================================
readme: README.md
author: Vinh Nguyen
author_url: https://github.com/ninjaprox
github_url: https://github.com/ninjaprox/NVActivityIndicatorView

theme: fullwidth
disable_search: true
hide_documentation_coverage: true
clean: true

module: NVActivityIndicatorView
module_version: 5.2.0
build_tool_arguments:
- -scheme
- NVActivityIndicatorView-Package
- -project
- NVActivityIndicatorView.xcodeproj


================================================
FILE: .swiftlint.yml
================================================
disabled_rules:
- line_length

type_name:
  max_length: 60
identifier_name:
  excluded:
  - x
  - y
  - i
  - j
function_body_length:
  warning: 50


================================================
FILE: CHANGELOG.md
================================================
# Change log

## [5.2.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/5.2.0)

-   Add privacy manifest (#349)

## [5.1.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/5.1.1)

-   Fix #319 (amendment)

## [5.1.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/5.1.0)

-   Fix #319

## [5.0.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/5.0.1)

-   Fix #314

## [5.0.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/5.0.0)

-   Deprecate `NVActivityIndicatorViewable` and `NVActivityIndicatorPresenter`
-   By default, `NVActivityIndicatorView` pod doesn't include `NVActivityIndicatorViewable` and `NVActivityIndicatorPresenter`, use `NVActivityIndicatorView/Extended` instead
-   The same applies for `NVActivityIndicatorView` and `NVActivityIndicatorViewExtended` when using Swift Package Manager
-   Drop support for Swift <4.2

## [4.8.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.8.0)

-   Add Swift Package Manager support (#290)

## [4.7.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.7.0)

-   Default nil fadeInAnimation and fadeOutAnimation (#264)
-   Swift 5 migration (#274)

## [4.6.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.6.1)

-   Fix #261

## [4.6.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.6.0)

-   New NVActivityIndicatorAnimationBallDoubleBounce animation (#258)
-   Unify product name (#260)

## [4.5.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.5.1)

-   Fix #251

## [4.5.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.5.0)

-   Add tvOS target (#248)

## [4.4.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.4.1)

-   Don’t start/stop animating if unnecessary (#239)
-   Specify Swift version in Podspec (#245)

## [4.4.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.4.0)

-   Fix #211
-   Swift 4.2 migration

## [4.3.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.3.0)

-   Handle starting while waiting to stop (#218)
-   UI blocker fade in/out animation (#219)

## [4.2.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.2.1)

-   Fix #213

## [4.2.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.2.0)

-   Refactor `NVActivityIndicatorPresenter` with state pattern
-   Expose `isAnimating` from `NVActivityIndicatorPresenter` and `NVActivityIndicatorViewable` (#204)
-   Fix tests

## [4.1.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.1.1)

-   Fix #186, #189

## [4.1.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.1.0)

-   Introduce message spacing
-   New circle stroke spin animation

## [4.0.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.0.1)

-   Fix view in auto layout
-   Fix #173, #180

## [4.0.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/4.0.0)

-   Update to Swift 4

## [3.7.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/3.7.0)

-   Support app extension

## [3.6.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/3.6.1)

-   Fix #138

## [3.6.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/3.6.0)

-   Fix #128

## [3.5.2](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/3.5.2)

-   Fix #132

## [3.5.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/3.5.1)

-   Fix #123

## [v3.5](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v3.5)

-   Fix #121
-   Fix setting message

## [v3.4](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v3.4)

-   Fix constraint conflict in UI blocker

## [v3.3](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v3.3)

-   Able to change text color in UI blocker
-   Fix UI blocker layer on orientation change

## [v3.2](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v3.2)

-   Able to change UI blocker background color
-   Able to change message in UI blocker during displaying

## [v3.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v3.1)

-   Optimize compile time
-   Update setting to Swift 3.0.1
-   Add default message
-   Custom message font
-   Auto message width

## [v3.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v3.0)

-   Support Xcode 8 and Swift 3

## [v2.12](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.12)

-   Fix infinite loop caused by `stopAnimation()` (#67)

## [v2.11](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.11)

-   Fix when used with MBProgressHUD
-   Abilitiy to display UI blocker anywher
-   Time threshold to display UI blocker
-   Minimum display time of UI blocker
-   Deprecate some APIs
-   Add tests

## [v2.10](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.10)

-   Fix UI blocker not showing full screen
-   Support tvOS

## [v2.9](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.9)

-   Ability to change size of animation in UI blocker

## [v2.8](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.8)

-   New Orbit animation
-   New Audio equalizer animation

## [v2.7](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.7)

-   Display as UI blocker for UIViewController
-   Be able to change defaults

## [v2.6](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.6)

-   Fix BallSpinFadeLoader animation
-   Fix LineSpinFadeLoader animation
-   Fix BallRotateChase animation
-   Change default animation to BallSpinFadeLoader

## [v2.5](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.5)

-   Fix padding issues

## [v2.4](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.4)

-   Fix autolayout compability when using in Storyboard
-   Support for IBInpectable

## [v2.3](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.3)

-   Fix bug when orientation changes once stopped animation
-   Update document

## [v2.2](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.2)

-   Public properties of animation
-   Public hidesWhenStopped and animating
-   New animation:
    -   Ball rotate chase

## [v2.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.1)

-   Support Carthage

## [v2.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v2.0)

-   Update to Swift 2.0

## [v1.3](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v1.3)

-   More convenient constructor
-   Hide when stopped option

## [v1.2](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v1.2)

-   Fix issue when using as framework
-   Set default animation type to pacman
-   Add documentation

## [v1.1](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v1.1)

-   Change project structure to work well with CocoaPods
-   Small fix in `podspec`

## [v1.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/v1.0)

-   Initial release
-   Full implementations of 28 loaders from loaders.css


================================================
FILE: Example/AppDelegate.swift
================================================
//
//  AppDelegate.swift
//  Example
//
// The MIT License (MIT)

// Copyright (c) 2020 Vinh Nguyen

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }

    // MARK: UISceneSession Lifecycle

    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        // Called when a new scene session is being created.
        // Use this method to select a configuration to create the new scene with.
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }

    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
        // Called when the user discards a scene session.
        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
    }

}


================================================
FILE: Example/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "iphone",
      "size" : "20x20",
      "scale" : "2x"
    },
    {
      "idiom" : "iphone",
      "size" : "20x20",
      "scale" : "3x"
    },
    {
      "idiom" : "iphone",
      "size" : "29x29",
      "scale" : "2x"
    },
    {
      "idiom" : "iphone",
      "size" : "29x29",
      "scale" : "3x"
    },
    {
      "idiom" : "iphone",
      "size" : "40x40",
      "scale" : "2x"
    },
    {
      "idiom" : "iphone",
      "size" : "40x40",
      "scale" : "3x"
    },
    {
      "idiom" : "iphone",
      "size" : "60x60",
      "scale" : "2x"
    },
    {
      "idiom" : "iphone",
      "size" : "60x60",
      "scale" : "3x"
    },
    {
      "idiom" : "ipad",
      "size" : "20x20",
      "scale" : "1x"
    },
    {
      "idiom" : "ipad",
      "size" : "20x20",
      "scale" : "2x"
    },
    {
      "idiom" : "ipad",
      "size" : "29x29",
      "scale" : "1x"
    },
    {
      "idiom" : "ipad",
      "size" : "29x29",
      "scale" : "2x"
    },
    {
      "idiom" : "ipad",
      "size" : "40x40",
      "scale" : "1x"
    },
    {
      "idiom" : "ipad",
      "size" : "40x40",
      "scale" : "2x"
    },
    {
      "idiom" : "ipad",
      "size" : "76x76",
      "scale" : "1x"
    },
    {
      "idiom" : "ipad",
      "size" : "76x76",
      "scale" : "2x"
    },
    {
      "idiom" : "ipad",
      "size" : "83.5x83.5",
      "scale" : "2x"
    },
    {
      "idiom" : "ios-marketing",
      "size" : "1024x1024",
      "scale" : "1x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: Example/Assets.xcassets/Contents.json
================================================
{
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: Example/Base.lproj/LaunchScreen.storyboard
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
    <dependencies>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <scenes>
        <!--View Controller-->
        <scene sceneID="EHf-IW-A2E">
            <objects>
                <viewController id="01J-lp-oVM" sceneMemberID="viewController">
                    <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <color key="backgroundColor" xcode11CocoaTouchSystemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
                        <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
                    </view>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="53" y="375"/>
        </scene>
    </scenes>
</document>


================================================
FILE: Example/Base.lproj/Main.storyboard
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
    <dependencies>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <scenes>
        <!--View Controller-->
        <scene sceneID="tne-QT-ifu">
            <objects>
                <viewController id="BYZ-38-t0r" customClass="ViewController" customModuleProvider="target" sceneMemberID="viewController">
                    <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <color key="backgroundColor" xcode11CocoaTouchSystemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
                        <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
                    </view>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
            </objects>
        </scene>
    </scenes>
</document>


================================================
FILE: Example/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>$(DEVELOPMENT_LANGUAGE)</string>
	<key>CFBundleExecutable</key>
	<string>$(EXECUTABLE_NAME)</string>
	<key>CFBundleIdentifier</key>
	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>$(PRODUCT_NAME)</string>
	<key>CFBundlePackageType</key>
	<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
	<key>CFBundleShortVersionString</key>
	<string>5.2.0</string>
	<key>CFBundleVersion</key>
	<string>48</string>
	<key>LSRequiresIPhoneOS</key>
	<true/>
	<key>UIApplicationSceneManifest</key>
	<dict>
		<key>UIApplicationSupportsMultipleScenes</key>
		<false/>
		<key>UISceneConfigurations</key>
		<dict>
			<key>UIWindowSceneSessionRoleApplication</key>
			<array>
				<dict>
					<key>UISceneConfigurationName</key>
					<string>Default Configuration</string>
					<key>UISceneDelegateClassName</key>
					<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
					<key>UISceneStoryboardFile</key>
					<string>Main</string>
				</dict>
			</array>
		</dict>
	</dict>
	<key>UILaunchStoryboardName</key>
	<string>LaunchScreen</string>
	<key>UIMainStoryboardFile</key>
	<string>Main</string>
	<key>UIRequiredDeviceCapabilities</key>
	<array>
		<string>armv7</string>
	</array>
	<key>UISupportedInterfaceOrientations</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
	</array>
	<key>UISupportedInterfaceOrientations~ipad</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationPortraitUpsideDown</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
	</array>
</dict>
</plist>


================================================
FILE: Example/SceneDelegate.swift
================================================
//
//  SceneDelegate.swift
//  Example
//
// The MIT License (MIT)

// Copyright (c) 2020 Vinh Nguyen

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//

import UIKit

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
        guard (scene as? UIWindowScene) != nil else { return }
    }

    func sceneDidDisconnect(_ scene: UIScene) {
        // Called as the scene is being released by the system.
        // This occurs shortly after the scene enters the background, or when its session is discarded.
        // Release any resources associated with this scene that can be re-created the next time the scene connects.
        // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).
    }

    func sceneDidBecomeActive(_ scene: UIScene) {
        // Called when the scene has moved from an inactive state to an active state.
        // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
    }

    func sceneWillResignActive(_ scene: UIScene) {
        // Called when the scene will move from an active state to an inactive state.
        // This may occur due to temporary interruptions (ex. an incoming phone call).
    }

    func sceneWillEnterForeground(_ scene: UIScene) {
        // Called as the scene transitions from the background to the foreground.
        // Use this method to undo the changes made on entering the background.
    }

    func sceneDidEnterBackground(_ scene: UIScene) {
        // Called as the scene transitions from the foreground to the background.
        // Use this method to save data, release shared resources, and store enough scene-specific state information
        // to restore the scene back to its current state.
    }

}


================================================
FILE: Example/ViewController.swift
================================================
//
//  ViewController.swift
//  Example
//
// The MIT License (MIT)

// Copyright (c) 2020 Vinh Nguyen

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//

import UIKit
import NVActivityIndicatorView
import NVActivityIndicatorViewExtended

class ViewController: UIViewController, NVActivityIndicatorViewable {

    private let presentingIndicatorTypes = {
        return NVActivityIndicatorType.allCases.filter { $0 != .blank }
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor(red: CGFloat(237 / 255.0), green: CGFloat(85 / 255.0), blue: CGFloat(101 / 255.0), alpha: 1)
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        let safeArea = view.safeAreaLayoutGuide.layoutFrame

        var cols = 4
        var rows = Int(ceil(Double(presentingIndicatorTypes.count) / 4.0))
        if safeArea.width > safeArea.height {
            //Landscape
            cols = Int(ceil(Double(presentingIndicatorTypes.count) / 4.0))
            rows = 4
        }
        let cellWidth = Int(safeArea.width / CGFloat(cols))
        let cellHeight = Int(safeArea.height / CGFloat(rows))

        self.view.subviews.forEach {
            $0.removeFromSuperview()
        }

        for (index, indicatorType) in presentingIndicatorTypes.enumerated() {
            let x = index % cols * cellWidth + Int(safeArea.origin.x)
            let y = index / cols * cellHeight + Int(safeArea.origin.y)
            let frame = CGRect(x: x, y: y, width: cellWidth, height: cellHeight)
            let activityIndicatorView = NVActivityIndicatorView(frame: frame,
                                                                type: indicatorType)
            let animationTypeLabel = UILabel(frame: frame)

            animationTypeLabel.text = String(index)
            animationTypeLabel.sizeToFit()
            animationTypeLabel.allowsDefaultTighteningForTruncation = true
            animationTypeLabel.textColor = UIColor.white
            animationTypeLabel.frame.origin.x += 5
            animationTypeLabel.frame.origin.y += CGFloat(cellHeight) - animationTypeLabel.frame.size.height

            activityIndicatorView.padding = 20
            if indicatorType == NVActivityIndicatorType.orbit {
                activityIndicatorView.padding = 0
            }
            self.view.addSubview(activityIndicatorView)
            self.view.addSubview(animationTypeLabel)
            activityIndicatorView.startAnimating()

            let button = UIButton(frame: frame)
            button.tag = index
            button.addTarget(self,
                             action: #selector(buttonTapped(_:)),
                             for: .touchUpInside)
            self.view.addSubview(button)
        }
    }

    @objc func buttonTapped(_ sender: UIButton) {
        let size = CGSize(width: 30, height: 30)
        let selectedIndicatorIndex = sender.tag
        let indicatorType = presentingIndicatorTypes[selectedIndicatorIndex]

        startAnimating(size, message: "Loading...", type: indicatorType, fadeInAnimation: nil)

        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1.5) {
            NVActivityIndicatorPresenter.sharedInstance.setMessage("Authenticating...")
        }

        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3) {
            self.stopAnimating(nil)
        }
    }
}


================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2016 Vinh Nguyen

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: NVActivityIndicatorView.podspec
================================================
Pod::Spec.new do |s|
  s.name              = 'NVActivityIndicatorView'
  s.version           = '5.2.0'
  s.summary           = 'A collection of awesome loading animations'
  s.homepage          = 'https://github.com/ninjaprox/NVActivityIndicatorView'
  s.screenshot        = 'https://raw.githubusercontent.com/ninjaprox/NVActivityIndicatorView/master/Demo.gif'
  s.license           = { type: 'MIT', file: 'LICENSE' }
  s.author            = { 'Vinh Nguyen' => 'ninjaprox@gmail.com' }
  s.social_media_url  = 'http://twitter.com/ninjaprox'
  s.documentation_url = 'https://nvactivityindicatorview.vinhis.me'

  s.ios.deployment_target  = '9.0'
  s.tvos.deployment_target = '9.0'
  s.swift_version          = '5.0'

  s.source = { git: 'https://github.com/ninjaprox/NVActivityIndicatorView.git',
               tag: s.version }

  s.subspec 'Base' do |ss|
    ss.source_files = 'Sources/Base/**/*.swift'
  end
  s.subspec 'Extended' do |ss|
    ss.dependency 'NVActivityIndicatorView/Base'
    ss.source_files = 'Sources/Extended/**/*.swift'
  end
  s.default_subspec = 'Base'

  s.frameworks = 'UIKit', 'QuartzCore'
end


================================================
FILE: NVActivityIndicatorView.xcodeproj/NVActivityIndicatorViewExtended_Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>en</string>
	<key>CFBundleExecutable</key>
	<string>$(EXECUTABLE_NAME)</string>
	<key>CFBundleIdentifier</key>
	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>$(PRODUCT_NAME)</string>
	<key>CFBundlePackageType</key>
	<string>FMWK</string>
	<key>CFBundleShortVersionString</key>
	<string>5.2.0</string>
	<key>CFBundleSignature</key>
	<string>????</string>
	<key>CFBundleVersion</key>
	<string>48</string>
	<key>NSPrincipalClass</key>
	<string></string>
</dict>
</plist>


================================================
FILE: NVActivityIndicatorView.xcodeproj/NVActivityIndicatorView_Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>en</string>
	<key>CFBundleExecutable</key>
	<string>$(EXECUTABLE_NAME)</string>
	<key>CFBundleIdentifier</key>
	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>$(PRODUCT_NAME)</string>
	<key>CFBundlePackageType</key>
	<string>FMWK</string>
	<key>CFBundleShortVersionString</key>
	<string>5.2.0</string>
	<key>CFBundleSignature</key>
	<string>????</string>
	<key>CFBundleVersion</key>
	<string>48</string>
	<key>NSPrincipalClass</key>
	<string></string>
</dict>
</plist>


================================================
FILE: NVActivityIndicatorView.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
	archiveVersion = 1;
	classes = {
	};
	objectVersion = 54;
	objects = {

/* Begin PBXBuildFile section */
		1F1836E0248CEFC200583430 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1836DF248CEFC200583430 /* AppDelegate.swift */; };
		1F1836E2248CEFC200583430 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1836E1248CEFC200583430 /* SceneDelegate.swift */; };
		1F1836E4248CEFC200583430 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F1836E3248CEFC200583430 /* ViewController.swift */; };
		1F1836E7248CEFC200583430 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1F1836E5248CEFC200583430 /* Main.storyboard */; };
		1F1836E9248CEFC300583430 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1F1836E8248CEFC300583430 /* Assets.xcassets */; };
		1F1836EC248CEFC300583430 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1F1836EA248CEFC300583430 /* LaunchScreen.storyboard */; };
		1F1836F2248CF08B00583430 /* NVActivityIndicatorViewExtended.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "NVActivityIndicatorView::NVActivityIndicatorViewExtended::Product" /* NVActivityIndicatorViewExtended.framework */; };
		1F1836F3248CF08B00583430 /* NVActivityIndicatorViewExtended.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = "NVActivityIndicatorView::NVActivityIndicatorViewExtended::Product" /* NVActivityIndicatorViewExtended.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
		1F183707248CF29F00583430 /* ActivityDataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F183706248CF29F00583430 /* ActivityDataTests.swift */; };
		1F18370B248CF31500583430 /* NVActivityIndicatorPresenterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F183708248CF31500583430 /* NVActivityIndicatorPresenterTests.swift */; };
		1F18370C248CF31500583430 /* NVActivityIndicatorViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F183709248CF31500583430 /* NVActivityIndicatorViewTests.swift */; };
		1F18370D248CF31500583430 /* NVActivityIndicatorTypeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F18370A248CF31500583430 /* NVActivityIndicatorTypeTests.swift */; };
		OBJ_102 /* NVActivityIndicatorPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_48 /* NVActivityIndicatorPresenter.swift */; };
		OBJ_103 /* NVActivityIndicatorViewable.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_49 /* NVActivityIndicatorViewable.swift */; };
		OBJ_105 /* NVActivityIndicatorView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "NVActivityIndicatorView::NVActivityIndicatorView::Product" /* NVActivityIndicatorView.framework */; };
		OBJ_112 /* Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_6 /* Package.swift */; };
		OBJ_59 /* NVActivityIndicatorAnimationAudioEqualizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_10 /* NVActivityIndicatorAnimationAudioEqualizer.swift */; };
		OBJ_60 /* NVActivityIndicatorAnimationBallBeat.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_11 /* NVActivityIndicatorAnimationBallBeat.swift */; };
		OBJ_61 /* NVActivityIndicatorAnimationBallClipRotate.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_12 /* NVActivityIndicatorAnimationBallClipRotate.swift */; };
		OBJ_62 /* NVActivityIndicatorAnimationBallClipRotateMultiple.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_13 /* NVActivityIndicatorAnimationBallClipRotateMultiple.swift */; };
		OBJ_63 /* NVActivityIndicatorAnimationBallClipRotatePulse.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_14 /* NVActivityIndicatorAnimationBallClipRotatePulse.swift */; };
		OBJ_64 /* NVActivityIndicatorAnimationBallDoubleBounce.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_15 /* NVActivityIndicatorAnimationBallDoubleBounce.swift */; };
		OBJ_65 /* NVActivityIndicatorAnimationBallGridBeat.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_16 /* NVActivityIndicatorAnimationBallGridBeat.swift */; };
		OBJ_66 /* NVActivityIndicatorAnimationBallGridPulse.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_17 /* NVActivityIndicatorAnimationBallGridPulse.swift */; };
		OBJ_67 /* NVActivityIndicatorAnimationBallPulse.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_18 /* NVActivityIndicatorAnimationBallPulse.swift */; };
		OBJ_68 /* NVActivityIndicatorAnimationBallPulseRise.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_19 /* NVActivityIndicatorAnimationBallPulseRise.swift */; };
		OBJ_69 /* NVActivityIndicatorAnimationBallPulseSync.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_20 /* NVActivityIndicatorAnimationBallPulseSync.swift */; };
		OBJ_70 /* NVActivityIndicatorAnimationBallRotate.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_21 /* NVActivityIndicatorAnimationBallRotate.swift */; };
		OBJ_71 /* NVActivityIndicatorAnimationBallRotateChase.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_22 /* NVActivityIndicatorAnimationBallRotateChase.swift */; };
		OBJ_72 /* NVActivityIndicatorAnimationBallScale.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_23 /* NVActivityIndicatorAnimationBallScale.swift */; };
		OBJ_73 /* NVActivityIndicatorAnimationBallScaleMultiple.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_24 /* NVActivityIndicatorAnimationBallScaleMultiple.swift */; };
		OBJ_74 /* NVActivityIndicatorAnimationBallScaleRipple.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_25 /* NVActivityIndicatorAnimationBallScaleRipple.swift */; };
		OBJ_75 /* NVActivityIndicatorAnimationBallScaleRippleMultiple.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_26 /* NVActivityIndicatorAnimationBallScaleRippleMultiple.swift */; };
		OBJ_76 /* NVActivityIndicatorAnimationBallSpinFadeLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_27 /* NVActivityIndicatorAnimationBallSpinFadeLoader.swift */; };
		OBJ_77 /* NVActivityIndicatorAnimationBallTrianglePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_28 /* NVActivityIndicatorAnimationBallTrianglePath.swift */; };
		OBJ_78 /* NVActivityIndicatorAnimationBallZigZag.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_29 /* NVActivityIndicatorAnimationBallZigZag.swift */; };
		OBJ_79 /* NVActivityIndicatorAnimationBallZigZagDeflect.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_30 /* NVActivityIndicatorAnimationBallZigZagDeflect.swift */; };
		OBJ_80 /* NVActivityIndicatorAnimationBlank.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_31 /* NVActivityIndicatorAnimationBlank.swift */; };
		OBJ_81 /* NVActivityIndicatorAnimationCircleStrokeSpin.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_32 /* NVActivityIndicatorAnimationCircleStrokeSpin.swift */; };
		OBJ_82 /* NVActivityIndicatorAnimationCubeTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_33 /* NVActivityIndicatorAnimationCubeTransition.swift */; };
		OBJ_83 /* NVActivityIndicatorAnimationLineScale.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_34 /* NVActivityIndicatorAnimationLineScale.swift */; };
		OBJ_84 /* NVActivityIndicatorAnimationLineScaleParty.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_35 /* NVActivityIndicatorAnimationLineScaleParty.swift */; };
		OBJ_85 /* NVActivityIndicatorAnimationLineScalePulseOut.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_36 /* NVActivityIndicatorAnimationLineScalePulseOut.swift */; };
		OBJ_86 /* NVActivityIndicatorAnimationLineScalePulseOutRapid.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_37 /* NVActivityIndicatorAnimationLineScalePulseOutRapid.swift */; };
		OBJ_87 /* NVActivityIndicatorAnimationLineSpinFadeLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_38 /* NVActivityIndicatorAnimationLineSpinFadeLoader.swift */; };
		OBJ_88 /* NVActivityIndicatorAnimationOrbit.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_39 /* NVActivityIndicatorAnimationOrbit.swift */; };
		OBJ_89 /* NVActivityIndicatorAnimationPacman.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_40 /* NVActivityIndicatorAnimationPacman.swift */; };
		OBJ_90 /* NVActivityIndicatorAnimationSemiCircleSpin.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_41 /* NVActivityIndicatorAnimationSemiCircleSpin.swift */; };
		OBJ_91 /* NVActivityIndicatorAnimationSquareSpin.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_42 /* NVActivityIndicatorAnimationSquareSpin.swift */; };
		OBJ_92 /* NVActivityIndicatorAnimationTriangleSkewSpin.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_43 /* NVActivityIndicatorAnimationTriangleSkewSpin.swift */; };
		OBJ_93 /* NVActivityIndicatorAnimationDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_44 /* NVActivityIndicatorAnimationDelegate.swift */; };
		OBJ_94 /* NVActivityIndicatorShape.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_45 /* NVActivityIndicatorShape.swift */; };
		OBJ_95 /* NVActivityIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_46 /* NVActivityIndicatorView.swift */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
		1F1836A8248CEC7400583430 /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = OBJ_1 /* Project object */;
			proxyType = 1;
			remoteGlobalIDString = "NVActivityIndicatorView::NVActivityIndicatorView";
			remoteInfo = NVActivityIndicatorView;
		};
		1F1836F4248CF08B00583430 /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = OBJ_1 /* Project object */;
			proxyType = 1;
			remoteGlobalIDString = "NVActivityIndicatorView::NVActivityIndicatorViewExtended";
			remoteInfo = NVActivityIndicatorViewExtended;
		};
		1F183700248CF25600583430 /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = OBJ_1 /* Project object */;
			proxyType = 1;
			remoteGlobalIDString = 1F1836DC248CEFC200583430;
			remoteInfo = Example;
		};
/* End PBXContainerItemProxy section */

/* Begin PBXCopyFilesBuildPhase section */
		1F1836F6248CF08B00583430 /* Embed Frameworks */ = {
			isa = PBXCopyFilesBuildPhase;
			buildActionMask = 2147483647;
			dstPath = "";
			dstSubfolderSpec = 10;
			files = (
				1F1836F3248CF08B00583430 /* NVActivityIndicatorViewExtended.framework in Embed Frameworks */,
			);
			name = "Embed Frameworks";
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXCopyFilesBuildPhase section */

/* Begin PBXFileReference section */
		1F1836DD248CEFC200583430 /* Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example.app; sourceTree = BUILT_PRODUCTS_DIR; };
		1F1836DF248CEFC200583430 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
		1F1836E1248CEFC200583430 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; };
		1F1836E3248CEFC200583430 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
		1F1836E6248CEFC200583430 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
		1F1836E8248CEFC300583430 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
		1F1836EB248CEFC300583430 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
		1F1836ED248CEFC300583430 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
		1F1836FB248CF25600583430 /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
		1F1836FF248CF25600583430 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
		1F183705248CF29E00583430 /* Tests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Tests-Bridging-Header.h"; sourceTree = "<group>"; };
		1F183706248CF29F00583430 /* ActivityDataTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActivityDataTests.swift; sourceTree = "<group>"; };
		1F183708248CF31500583430 /* NVActivityIndicatorPresenterTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorPresenterTests.swift; sourceTree = "<group>"; };
		1F183709248CF31500583430 /* NVActivityIndicatorViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorViewTests.swift; sourceTree = "<group>"; };
		1F18370A248CF31500583430 /* NVActivityIndicatorTypeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorTypeTests.swift; sourceTree = "<group>"; };
		1F73073E2BCFFEC700FBF25A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
		"NVActivityIndicatorView::NVActivityIndicatorView::Product" /* NVActivityIndicatorView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = NVActivityIndicatorView.framework; sourceTree = BUILT_PRODUCTS_DIR; };
		"NVActivityIndicatorView::NVActivityIndicatorViewExtended::Product" /* NVActivityIndicatorViewExtended.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = NVActivityIndicatorViewExtended.framework; sourceTree = BUILT_PRODUCTS_DIR; };
		OBJ_10 /* NVActivityIndicatorAnimationAudioEqualizer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationAudioEqualizer.swift; sourceTree = "<group>"; };
		OBJ_11 /* NVActivityIndicatorAnimationBallBeat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallBeat.swift; sourceTree = "<group>"; };
		OBJ_12 /* NVActivityIndicatorAnimationBallClipRotate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallClipRotate.swift; sourceTree = "<group>"; };
		OBJ_13 /* NVActivityIndicatorAnimationBallClipRotateMultiple.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallClipRotateMultiple.swift; sourceTree = "<group>"; };
		OBJ_14 /* NVActivityIndicatorAnimationBallClipRotatePulse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallClipRotatePulse.swift; sourceTree = "<group>"; };
		OBJ_15 /* NVActivityIndicatorAnimationBallDoubleBounce.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallDoubleBounce.swift; sourceTree = "<group>"; };
		OBJ_16 /* NVActivityIndicatorAnimationBallGridBeat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallGridBeat.swift; sourceTree = "<group>"; };
		OBJ_17 /* NVActivityIndicatorAnimationBallGridPulse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallGridPulse.swift; sourceTree = "<group>"; };
		OBJ_18 /* NVActivityIndicatorAnimationBallPulse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallPulse.swift; sourceTree = "<group>"; };
		OBJ_19 /* NVActivityIndicatorAnimationBallPulseRise.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallPulseRise.swift; sourceTree = "<group>"; };
		OBJ_20 /* NVActivityIndicatorAnimationBallPulseSync.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallPulseSync.swift; sourceTree = "<group>"; };
		OBJ_21 /* NVActivityIndicatorAnimationBallRotate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallRotate.swift; sourceTree = "<group>"; };
		OBJ_22 /* NVActivityIndicatorAnimationBallRotateChase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallRotateChase.swift; sourceTree = "<group>"; };
		OBJ_23 /* NVActivityIndicatorAnimationBallScale.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallScale.swift; sourceTree = "<group>"; };
		OBJ_24 /* NVActivityIndicatorAnimationBallScaleMultiple.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallScaleMultiple.swift; sourceTree = "<group>"; };
		OBJ_25 /* NVActivityIndicatorAnimationBallScaleRipple.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallScaleRipple.swift; sourceTree = "<group>"; };
		OBJ_26 /* NVActivityIndicatorAnimationBallScaleRippleMultiple.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallScaleRippleMultiple.swift; sourceTree = "<group>"; };
		OBJ_27 /* NVActivityIndicatorAnimationBallSpinFadeLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallSpinFadeLoader.swift; sourceTree = "<group>"; };
		OBJ_28 /* NVActivityIndicatorAnimationBallTrianglePath.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallTrianglePath.swift; sourceTree = "<group>"; };
		OBJ_29 /* NVActivityIndicatorAnimationBallZigZag.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallZigZag.swift; sourceTree = "<group>"; };
		OBJ_30 /* NVActivityIndicatorAnimationBallZigZagDeflect.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBallZigZagDeflect.swift; sourceTree = "<group>"; };
		OBJ_31 /* NVActivityIndicatorAnimationBlank.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationBlank.swift; sourceTree = "<group>"; };
		OBJ_32 /* NVActivityIndicatorAnimationCircleStrokeSpin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationCircleStrokeSpin.swift; sourceTree = "<group>"; };
		OBJ_33 /* NVActivityIndicatorAnimationCubeTransition.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationCubeTransition.swift; sourceTree = "<group>"; };
		OBJ_34 /* NVActivityIndicatorAnimationLineScale.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationLineScale.swift; sourceTree = "<group>"; };
		OBJ_35 /* NVActivityIndicatorAnimationLineScaleParty.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationLineScaleParty.swift; sourceTree = "<group>"; };
		OBJ_36 /* NVActivityIndicatorAnimationLineScalePulseOut.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationLineScalePulseOut.swift; sourceTree = "<group>"; };
		OBJ_37 /* NVActivityIndicatorAnimationLineScalePulseOutRapid.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationLineScalePulseOutRapid.swift; sourceTree = "<group>"; };
		OBJ_38 /* NVActivityIndicatorAnimationLineSpinFadeLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationLineSpinFadeLoader.swift; sourceTree = "<group>"; };
		OBJ_39 /* NVActivityIndicatorAnimationOrbit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationOrbit.swift; sourceTree = "<group>"; };
		OBJ_40 /* NVActivityIndicatorAnimationPacman.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationPacman.swift; sourceTree = "<group>"; };
		OBJ_41 /* NVActivityIndicatorAnimationSemiCircleSpin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationSemiCircleSpin.swift; sourceTree = "<group>"; };
		OBJ_42 /* NVActivityIndicatorAnimationSquareSpin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationSquareSpin.swift; sourceTree = "<group>"; };
		OBJ_43 /* NVActivityIndicatorAnimationTriangleSkewSpin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationTriangleSkewSpin.swift; sourceTree = "<group>"; };
		OBJ_44 /* NVActivityIndicatorAnimationDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationDelegate.swift; sourceTree = "<group>"; };
		OBJ_45 /* NVActivityIndicatorShape.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorShape.swift; sourceTree = "<group>"; };
		OBJ_46 /* NVActivityIndicatorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorView.swift; sourceTree = "<group>"; };
		OBJ_48 /* NVActivityIndicatorPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorPresenter.swift; sourceTree = "<group>"; };
		OBJ_49 /* NVActivityIndicatorViewable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorViewable.swift; sourceTree = "<group>"; };
		OBJ_6 /* Package.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; path = Package.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
		1F1836DA248CEFC200583430 /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
				1F1836F2248CF08B00583430 /* NVActivityIndicatorViewExtended.framework in Frameworks */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		1F1836F8248CF25600583430 /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		OBJ_104 /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 0;
			files = (
				OBJ_105 /* NVActivityIndicatorView.framework in Frameworks */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		OBJ_96 /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 0;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXFrameworksBuildPhase section */

/* Begin PBXGroup section */
		1F1836DE248CEFC200583430 /* Example */ = {
			isa = PBXGroup;
			children = (
				1F1836DF248CEFC200583430 /* AppDelegate.swift */,
				1F1836E1248CEFC200583430 /* SceneDelegate.swift */,
				1F1836E3248CEFC200583430 /* ViewController.swift */,
				1F1836E5248CEFC200583430 /* Main.storyboard */,
				1F1836E8248CEFC300583430 /* Assets.xcassets */,
				1F1836EA248CEFC300583430 /* LaunchScreen.storyboard */,
				1F1836ED248CEFC300583430 /* Info.plist */,
			);
			path = Example;
			sourceTree = "<group>";
		};
		1F1836F1248CF08B00583430 /* Frameworks */ = {
			isa = PBXGroup;
			children = (
			);
			name = Frameworks;
			sourceTree = "<group>";
		};
		1F1836FC248CF25600583430 /* Tests */ = {
			isa = PBXGroup;
			children = (
				1F183708248CF31500583430 /* NVActivityIndicatorPresenterTests.swift */,
				1F18370A248CF31500583430 /* NVActivityIndicatorTypeTests.swift */,
				1F183709248CF31500583430 /* NVActivityIndicatorViewTests.swift */,
				1F183706248CF29F00583430 /* ActivityDataTests.swift */,
				1F1836FF248CF25600583430 /* Info.plist */,
				1F183705248CF29E00583430 /* Tests-Bridging-Header.h */,
			);
			path = Tests;
			sourceTree = "<group>";
		};
		OBJ_47 /* NVActivityIndicatorViewExtended */ = {
			isa = PBXGroup;
			children = (
				OBJ_48 /* NVActivityIndicatorPresenter.swift */,
				OBJ_49 /* NVActivityIndicatorViewable.swift */,
			);
			name = NVActivityIndicatorViewExtended;
			path = Sources/Extended;
			sourceTree = SOURCE_ROOT;
		};
		OBJ_5 = {
			isa = PBXGroup;
			children = (
				1F73073E2BCFFEC700FBF25A /* PrivacyInfo.xcprivacy */,
				OBJ_6 /* Package.swift */,
				OBJ_7 /* Sources */,
				1F1836DE248CEFC200583430 /* Example */,
				1F1836FC248CF25600583430 /* Tests */,
				OBJ_51 /* Products */,
				1F1836F1248CF08B00583430 /* Frameworks */,
			);
			sourceTree = "<group>";
		};
		OBJ_51 /* Products */ = {
			isa = PBXGroup;
			children = (
				"NVActivityIndicatorView::NVActivityIndicatorView::Product" /* NVActivityIndicatorView.framework */,
				"NVActivityIndicatorView::NVActivityIndicatorViewExtended::Product" /* NVActivityIndicatorViewExtended.framework */,
				1F1836DD248CEFC200583430 /* Example.app */,
				1F1836FB248CF25600583430 /* Tests.xctest */,
			);
			name = Products;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		OBJ_7 /* Sources */ = {
			isa = PBXGroup;
			children = (
				OBJ_8 /* NVActivityIndicatorView */,
				OBJ_47 /* NVActivityIndicatorViewExtended */,
			);
			name = Sources;
			sourceTree = SOURCE_ROOT;
		};
		OBJ_8 /* NVActivityIndicatorView */ = {
			isa = PBXGroup;
			children = (
				OBJ_9 /* Animations */,
				OBJ_44 /* NVActivityIndicatorAnimationDelegate.swift */,
				OBJ_45 /* NVActivityIndicatorShape.swift */,
				OBJ_46 /* NVActivityIndicatorView.swift */,
			);
			name = NVActivityIndicatorView;
			path = Sources/Base;
			sourceTree = SOURCE_ROOT;
		};
		OBJ_9 /* Animations */ = {
			isa = PBXGroup;
			children = (
				OBJ_10 /* NVActivityIndicatorAnimationAudioEqualizer.swift */,
				OBJ_11 /* NVActivityIndicatorAnimationBallBeat.swift */,
				OBJ_12 /* NVActivityIndicatorAnimationBallClipRotate.swift */,
				OBJ_13 /* NVActivityIndicatorAnimationBallClipRotateMultiple.swift */,
				OBJ_14 /* NVActivityIndicatorAnimationBallClipRotatePulse.swift */,
				OBJ_15 /* NVActivityIndicatorAnimationBallDoubleBounce.swift */,
				OBJ_16 /* NVActivityIndicatorAnimationBallGridBeat.swift */,
				OBJ_17 /* NVActivityIndicatorAnimationBallGridPulse.swift */,
				OBJ_18 /* NVActivityIndicatorAnimationBallPulse.swift */,
				OBJ_19 /* NVActivityIndicatorAnimationBallPulseRise.swift */,
				OBJ_20 /* NVActivityIndicatorAnimationBallPulseSync.swift */,
				OBJ_21 /* NVActivityIndicatorAnimationBallRotate.swift */,
				OBJ_22 /* NVActivityIndicatorAnimationBallRotateChase.swift */,
				OBJ_23 /* NVActivityIndicatorAnimationBallScale.swift */,
				OBJ_24 /* NVActivityIndicatorAnimationBallScaleMultiple.swift */,
				OBJ_25 /* NVActivityIndicatorAnimationBallScaleRipple.swift */,
				OBJ_26 /* NVActivityIndicatorAnimationBallScaleRippleMultiple.swift */,
				OBJ_27 /* NVActivityIndicatorAnimationBallSpinFadeLoader.swift */,
				OBJ_28 /* NVActivityIndicatorAnimationBallTrianglePath.swift */,
				OBJ_29 /* NVActivityIndicatorAnimationBallZigZag.swift */,
				OBJ_30 /* NVActivityIndicatorAnimationBallZigZagDeflect.swift */,
				OBJ_31 /* NVActivityIndicatorAnimationBlank.swift */,
				OBJ_32 /* NVActivityIndicatorAnimationCircleStrokeSpin.swift */,
				OBJ_33 /* NVActivityIndicatorAnimationCubeTransition.swift */,
				OBJ_34 /* NVActivityIndicatorAnimationLineScale.swift */,
				OBJ_35 /* NVActivityIndicatorAnimationLineScaleParty.swift */,
				OBJ_36 /* NVActivityIndicatorAnimationLineScalePulseOut.swift */,
				OBJ_37 /* NVActivityIndicatorAnimationLineScalePulseOutRapid.swift */,
				OBJ_38 /* NVActivityIndicatorAnimationLineSpinFadeLoader.swift */,
				OBJ_39 /* NVActivityIndicatorAnimationOrbit.swift */,
				OBJ_40 /* NVActivityIndicatorAnimationPacman.swift */,
				OBJ_41 /* NVActivityIndicatorAnimationSemiCircleSpin.swift */,
				OBJ_42 /* NVActivityIndicatorAnimationSquareSpin.swift */,
				OBJ_43 /* NVActivityIndicatorAnimationTriangleSkewSpin.swift */,
			);
			path = Animations;
			sourceTree = "<group>";
		};
/* End PBXGroup section */

/* Begin PBXNativeTarget section */
		1F1836DC248CEFC200583430 /* Example */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = 1F1836F0248CEFC300583430 /* Build configuration list for PBXNativeTarget "Example" */;
			buildPhases = (
				1F1836D9248CEFC200583430 /* Sources */,
				1F1836DA248CEFC200583430 /* Frameworks */,
				1F1836DB248CEFC200583430 /* Resources */,
				1F1836F6248CF08B00583430 /* Embed Frameworks */,
			);
			buildRules = (
			);
			dependencies = (
				1F1836F5248CF08B00583430 /* PBXTargetDependency */,
			);
			name = Example;
			productName = Example;
			productReference = 1F1836DD248CEFC200583430 /* Example.app */;
			productType = "com.apple.product-type.application";
		};
		1F1836FA248CF25600583430 /* Tests */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = 1F183702248CF25600583430 /* Build configuration list for PBXNativeTarget "Tests" */;
			buildPhases = (
				1F1836F7248CF25600583430 /* Sources */,
				1F1836F8248CF25600583430 /* Frameworks */,
				1F1836F9248CF25600583430 /* Resources */,
			);
			buildRules = (
			);
			dependencies = (
				1F183701248CF25600583430 /* PBXTargetDependency */,
			);
			name = Tests;
			productName = Tests;
			productReference = 1F1836FB248CF25600583430 /* Tests.xctest */;
			productType = "com.apple.product-type.bundle.unit-test";
		};
		"NVActivityIndicatorView::NVActivityIndicatorView" /* NVActivityIndicatorView */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = OBJ_55 /* Build configuration list for PBXNativeTarget "NVActivityIndicatorView" */;
			buildPhases = (
				OBJ_58 /* Sources */,
				OBJ_96 /* Frameworks */,
			);
			buildRules = (
			);
			dependencies = (
				1F0742D12F6A40C600304500 /* PBXTargetDependency */,
			);
			name = NVActivityIndicatorView;
			productName = NVActivityIndicatorView;
			productReference = "NVActivityIndicatorView::NVActivityIndicatorView::Product" /* NVActivityIndicatorView.framework */;
			productType = "com.apple.product-type.framework";
		};
		"NVActivityIndicatorView::NVActivityIndicatorViewExtended" /* NVActivityIndicatorViewExtended */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = OBJ_98 /* Build configuration list for PBXNativeTarget "NVActivityIndicatorViewExtended" */;
			buildPhases = (
				OBJ_101 /* Sources */,
				OBJ_104 /* Frameworks */,
			);
			buildRules = (
			);
			dependencies = (
				1F0742D32F6A40CF00304500 /* PBXTargetDependency */,
				OBJ_106 /* PBXTargetDependency */,
			);
			name = NVActivityIndicatorViewExtended;
			productName = NVActivityIndicatorViewExtended;
			productReference = "NVActivityIndicatorView::NVActivityIndicatorViewExtended::Product" /* NVActivityIndicatorViewExtended.framework */;
			productType = "com.apple.product-type.framework";
		};
		"NVActivityIndicatorView::SwiftPMPackageDescription" /* NVActivityIndicatorViewPackageDescription */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = OBJ_108 /* Build configuration list for PBXNativeTarget "NVActivityIndicatorViewPackageDescription" */;
			buildPhases = (
				OBJ_111 /* Sources */,
			);
			buildRules = (
			);
			dependencies = (
			);
			name = NVActivityIndicatorViewPackageDescription;
			productName = NVActivityIndicatorViewPackageDescription;
			productType = "com.apple.product-type.framework";
		};
/* End PBXNativeTarget section */

/* Begin PBXProject section */
		OBJ_1 /* Project object */ = {
			isa = PBXProject;
			attributes = {
				BuildIndependentTargetsInParallel = YES;
				LastSwiftMigration = 9999;
				LastSwiftUpdateCheck = 1130;
				LastUpgradeCheck = 2630;
				TargetAttributes = {
					1F1836DC248CEFC200583430 = {
						CreatedOnToolsVersion = 11.3.1;
						ProvisioningStyle = Automatic;
					};
					1F1836FA248CF25600583430 = {
						CreatedOnToolsVersion = 11.3.1;
						LastSwiftMigration = 1130;
						ProvisioningStyle = Automatic;
						TestTargetID = 1F1836DC248CEFC200583430;
					};
				};
			};
			buildConfigurationList = OBJ_2 /* Build configuration list for PBXProject "NVActivityIndicatorView" */;
			compatibilityVersion = "Xcode 3.2";
			developmentRegion = en;
			hasScannedForEncodings = 0;
			knownRegions = (
				en,
				Base,
			);
			mainGroup = OBJ_5;
			packageReferences = (
				1F0742CF2F6A408300304500 /* XCRemoteSwiftPackageReference "SwiftLintPlugins" */,
			);
			productRefGroup = OBJ_51 /* Products */;
			projectDirPath = "";
			projectRoot = "";
			targets = (
				"NVActivityIndicatorView::NVActivityIndicatorView" /* NVActivityIndicatorView */,
				"NVActivityIndicatorView::NVActivityIndicatorViewExtended" /* NVActivityIndicatorViewExtended */,
				"NVActivityIndicatorView::SwiftPMPackageDescription" /* NVActivityIndicatorViewPackageDescription */,
				1F1836DC248CEFC200583430 /* Example */,
				1F1836FA248CF25600583430 /* Tests */,
			);
		};
/* End PBXProject section */

/* Begin PBXResourcesBuildPhase section */
		1F1836DB248CEFC200583430 /* Resources */ = {
			isa = PBXResourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				1F1836EC248CEFC300583430 /* LaunchScreen.storyboard in Resources */,
				1F1836E9248CEFC300583430 /* Assets.xcassets in Resources */,
				1F1836E7248CEFC200583430 /* Main.storyboard in Resources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		1F1836F9248CF25600583430 /* Resources */ = {
			isa = PBXResourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXResourcesBuildPhase section */

/* Begin PBXSourcesBuildPhase section */
		1F1836D9248CEFC200583430 /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				1F1836E4248CEFC200583430 /* ViewController.swift in Sources */,
				1F1836E0248CEFC200583430 /* AppDelegate.swift in Sources */,
				1F1836E2248CEFC200583430 /* SceneDelegate.swift in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		1F1836F7248CF25600583430 /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				1F18370D248CF31500583430 /* NVActivityIndicatorTypeTests.swift in Sources */,
				1F18370C248CF31500583430 /* NVActivityIndicatorViewTests.swift in Sources */,
				1F183707248CF29F00583430 /* ActivityDataTests.swift in Sources */,
				1F18370B248CF31500583430 /* NVActivityIndicatorPresenterTests.swift in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		OBJ_101 /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 0;
			files = (
				OBJ_102 /* NVActivityIndicatorPresenter.swift in Sources */,
				OBJ_103 /* NVActivityIndicatorViewable.swift in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		OBJ_111 /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 0;
			files = (
				OBJ_112 /* Package.swift in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		OBJ_58 /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 0;
			files = (
				OBJ_59 /* NVActivityIndicatorAnimationAudioEqualizer.swift in Sources */,
				OBJ_60 /* NVActivityIndicatorAnimationBallBeat.swift in Sources */,
				OBJ_61 /* NVActivityIndicatorAnimationBallClipRotate.swift in Sources */,
				OBJ_62 /* NVActivityIndicatorAnimationBallClipRotateMultiple.swift in Sources */,
				OBJ_63 /* NVActivityIndicatorAnimationBallClipRotatePulse.swift in Sources */,
				OBJ_64 /* NVActivityIndicatorAnimationBallDoubleBounce.swift in Sources */,
				OBJ_65 /* NVActivityIndicatorAnimationBallGridBeat.swift in Sources */,
				OBJ_66 /* NVActivityIndicatorAnimationBallGridPulse.swift in Sources */,
				OBJ_67 /* NVActivityIndicatorAnimationBallPulse.swift in Sources */,
				OBJ_68 /* NVActivityIndicatorAnimationBallPulseRise.swift in Sources */,
				OBJ_69 /* NVActivityIndicatorAnimationBallPulseSync.swift in Sources */,
				OBJ_70 /* NVActivityIndicatorAnimationBallRotate.swift in Sources */,
				OBJ_71 /* NVActivityIndicatorAnimationBallRotateChase.swift in Sources */,
				OBJ_72 /* NVActivityIndicatorAnimationBallScale.swift in Sources */,
				OBJ_73 /* NVActivityIndicatorAnimationBallScaleMultiple.swift in Sources */,
				OBJ_74 /* NVActivityIndicatorAnimationBallScaleRipple.swift in Sources */,
				OBJ_75 /* NVActivityIndicatorAnimationBallScaleRippleMultiple.swift in Sources */,
				OBJ_76 /* NVActivityIndicatorAnimationBallSpinFadeLoader.swift in Sources */,
				OBJ_77 /* NVActivityIndicatorAnimationBallTrianglePath.swift in Sources */,
				OBJ_78 /* NVActivityIndicatorAnimationBallZigZag.swift in Sources */,
				OBJ_79 /* NVActivityIndicatorAnimationBallZigZagDeflect.swift in Sources */,
				OBJ_80 /* NVActivityIndicatorAnimationBlank.swift in Sources */,
				OBJ_81 /* NVActivityIndicatorAnimationCircleStrokeSpin.swift in Sources */,
				OBJ_82 /* NVActivityIndicatorAnimationCubeTransition.swift in Sources */,
				OBJ_83 /* NVActivityIndicatorAnimationLineScale.swift in Sources */,
				OBJ_84 /* NVActivityIndicatorAnimationLineScaleParty.swift in Sources */,
				OBJ_85 /* NVActivityIndicatorAnimationLineScalePulseOut.swift in Sources */,
				OBJ_86 /* NVActivityIndicatorAnimationLineScalePulseOutRapid.swift in Sources */,
				OBJ_87 /* NVActivityIndicatorAnimationLineSpinFadeLoader.swift in Sources */,
				OBJ_88 /* NVActivityIndicatorAnimationOrbit.swift in Sources */,
				OBJ_89 /* NVActivityIndicatorAnimationPacman.swift in Sources */,
				OBJ_90 /* NVActivityIndicatorAnimationSemiCircleSpin.swift in Sources */,
				OBJ_91 /* NVActivityIndicatorAnimationSquareSpin.swift in Sources */,
				OBJ_92 /* NVActivityIndicatorAnimationTriangleSkewSpin.swift in Sources */,
				OBJ_93 /* NVActivityIndicatorAnimationDelegate.swift in Sources */,
				OBJ_94 /* NVActivityIndicatorShape.swift in Sources */,
				OBJ_95 /* NVActivityIndicatorView.swift in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXSourcesBuildPhase section */

/* Begin PBXTargetDependency section */
		1F0742D12F6A40C600304500 /* PBXTargetDependency */ = {
			isa = PBXTargetDependency;
			productRef = 1F0742D02F6A40C600304500 /* SwiftLintBuildToolPlugin */;
		};
		1F0742D32F6A40CF00304500 /* PBXTargetDependency */ = {
			isa = PBXTargetDependency;
			productRef = 1F0742D22F6A40CF00304500 /* SwiftLintBuildToolPlugin */;
		};
		1F1836F5248CF08B00583430 /* PBXTargetDependency */ = {
			isa = PBXTargetDependency;
			target = "NVActivityIndicatorView::NVActivityIndicatorViewExtended" /* NVActivityIndicatorViewExtended */;
			targetProxy = 1F1836F4248CF08B00583430 /* PBXContainerItemProxy */;
		};
		1F183701248CF25600583430 /* PBXTargetDependency */ = {
			isa = PBXTargetDependency;
			target = 1F1836DC248CEFC200583430 /* Example */;
			targetProxy = 1F183700248CF25600583430 /* PBXContainerItemProxy */;
		};
		OBJ_106 /* PBXTargetDependency */ = {
			isa = PBXTargetDependency;
			target = "NVActivityIndicatorView::NVActivityIndicatorView" /* NVActivityIndicatorView */;
			targetProxy = 1F1836A8248CEC7400583430 /* PBXContainerItemProxy */;
		};
/* End PBXTargetDependency section */

/* Begin PBXVariantGroup section */
		1F1836E5248CEFC200583430 /* Main.storyboard */ = {
			isa = PBXVariantGroup;
			children = (
				1F1836E6248CEFC200583430 /* Base */,
			);
			name = Main.storyboard;
			sourceTree = "<group>";
		};
		1F1836EA248CEFC300583430 /* LaunchScreen.storyboard */ = {
			isa = PBXVariantGroup;
			children = (
				1F1836EB248CEFC300583430 /* Base */,
			);
			name = LaunchScreen.storyboard;
			sourceTree = "<group>";
		};
/* End PBXVariantGroup section */

/* Begin XCBuildConfiguration section */
		1F1836EE248CEFC300583430 /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
				CLANG_ANALYZER_NONNULL = YES;
				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_WEAK = YES;
				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_COMMA = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
				CLANG_WARN_STRICT_PROTOTYPES = YES;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				CODE_SIGN_STYLE = Automatic;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				ENABLE_TESTABILITY = YES;
				GCC_C_LANGUAGE_STANDARD = gnu11;
				GCC_DYNAMIC_NO_PIC = NO;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_PREPROCESSOR_DEFINITIONS = (
					"DEBUG=1",
					"$(inherited)",
				);
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				INFOPLIST_FILE = Example/Info.plist;
				IPHONEOS_DEPLOYMENT_TARGET = 13.2;
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
				);
				MACOSX_DEPLOYMENT_TARGET = 11.0;
				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
				MTL_FAST_MATH = YES;
				PRODUCT_BUNDLE_IDENTIFIER = me.vinhis.Example;
				PRODUCT_NAME = "$(TARGET_NAME)";
				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
				SWIFT_VERSION = 5.0;
				TARGETED_DEVICE_FAMILY = "1,2";
			};
			name = Debug;
		};
		1F1836EF248CEFC300583430 /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
				CLANG_ANALYZER_NONNULL = YES;
				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_WEAK = YES;
				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_COMMA = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
				CLANG_WARN_STRICT_PROTOTYPES = YES;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				CODE_SIGN_STYLE = Automatic;
				COPY_PHASE_STRIP = NO;
				ENABLE_NS_ASSERTIONS = NO;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				GCC_C_LANGUAGE_STANDARD = gnu11;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				INFOPLIST_FILE = Example/Info.plist;
				IPHONEOS_DEPLOYMENT_TARGET = 13.2;
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
				);
				MACOSX_DEPLOYMENT_TARGET = 11.0;
				MTL_ENABLE_DEBUG_INFO = NO;
				MTL_FAST_MATH = YES;
				PRODUCT_BUNDLE_IDENTIFIER = me.vinhis.Example;
				PRODUCT_NAME = "$(TARGET_NAME)";
				SWIFT_VERSION = 5.0;
				TARGETED_DEVICE_FAMILY = "1,2";
				VALIDATE_PRODUCT = YES;
			};
			name = Release;
		};
		1F183703248CF25600583430 /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				BUNDLE_LOADER = "$(TEST_HOST)";
				CLANG_ANALYZER_NONNULL = YES;
				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_WEAK = YES;
				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_COMMA = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
				CLANG_WARN_STRICT_PROTOTYPES = YES;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				CODE_SIGN_STYLE = Automatic;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				ENABLE_TESTABILITY = YES;
				GCC_C_LANGUAGE_STANDARD = gnu11;
				GCC_DYNAMIC_NO_PIC = NO;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_PREPROCESSOR_DEFINITIONS = (
					"DEBUG=1",
					"$(inherited)",
				);
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				INFOPLIST_FILE = Tests/Info.plist;
				IPHONEOS_DEPLOYMENT_TARGET = 13.2;
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
					"@loader_path/Frameworks",
				);
				MACOSX_DEPLOYMENT_TARGET = 11.0;
				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
				MTL_FAST_MATH = YES;
				PRODUCT_BUNDLE_IDENTIFIER = me.vinhis.Tests;
				PRODUCT_NAME = "$(TARGET_NAME)";
				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
				SWIFT_OBJC_BRIDGING_HEADER = "Tests/Tests-Bridging-Header.h";
				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
				SWIFT_VERSION = 5.0;
				TARGETED_DEVICE_FAMILY = "1,2";
				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Example.app/Example";
			};
			name = Debug;
		};
		1F183704248CF25600583430 /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				BUNDLE_LOADER = "$(TEST_HOST)";
				CLANG_ANALYZER_NONNULL = YES;
				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_WEAK = YES;
				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_COMMA = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
				CLANG_WARN_STRICT_PROTOTYPES = YES;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				CODE_SIGN_STYLE = Automatic;
				COPY_PHASE_STRIP = NO;
				ENABLE_NS_ASSERTIONS = NO;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				GCC_C_LANGUAGE_STANDARD = gnu11;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				INFOPLIST_FILE = Tests/Info.plist;
				IPHONEOS_DEPLOYMENT_TARGET = 13.2;
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
					"@loader_path/Frameworks",
				);
				MACOSX_DEPLOYMENT_TARGET = 11.0;
				MTL_ENABLE_DEBUG_INFO = NO;
				MTL_FAST_MATH = YES;
				PRODUCT_BUNDLE_IDENTIFIER = me.vinhis.Tests;
				PRODUCT_NAME = "$(TARGET_NAME)";
				SWIFT_OBJC_BRIDGING_HEADER = "Tests/Tests-Bridging-Header.h";
				SWIFT_VERSION = 5.0;
				TARGETED_DEVICE_FAMILY = "1,2";
				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Example.app/Example";
				VALIDATE_PRODUCT = YES;
			};
			name = Release;
		};
		OBJ_100 /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				CODE_SIGN_IDENTITY = "";
				CURRENT_PROJECT_VERSION = 48;
				ENABLE_TESTABILITY = YES;
				FRAMEWORK_SEARCH_PATHS = (
					"$(inherited)",
					"$(PLATFORM_DIR)/Developer/Library/Frameworks",
				);
				HEADER_SEARCH_PATHS = "$(inherited)";
				INFOPLIST_FILE = NVActivityIndicatorView.xcodeproj/NVActivityIndicatorViewExtended_Info.plist;
				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"$(TOOLCHAIN_DIR)/usr/lib/swift/macosx",
				);
				MACOSX_DEPLOYMENT_TARGET = 11.0;
				MARKETING_VERSION = 5.1.0;
				OTHER_CFLAGS = "$(inherited)";
				OTHER_LDFLAGS = "$(inherited)";
				OTHER_SWIFT_FLAGS = "$(inherited)";
				PRODUCT_BUNDLE_IDENTIFIER = NVActivityIndicatorViewExtended;
				PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)";
				PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
				SKIP_INSTALL = YES;
				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)";
				SWIFT_VERSION = 5.0;
				TARGETED_DEVICE_FAMILY = "1,2";
				TARGET_NAME = NVActivityIndicatorViewExtended;
				TVOS_DEPLOYMENT_TARGET = 12.0;
				WATCHOS_DEPLOYMENT_TARGET = 2.0;
			};
			name = Release;
		};
		OBJ_109 /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				CODE_SIGN_IDENTITY = "";
				LD = /usr/bin/true;
				MACOSX_DEPLOYMENT_TARGET = 11.0;
				OTHER_SWIFT_FLAGS = "-swift-version 5 -I $(TOOLCHAIN_DIR)/usr/lib/swift/pm/4_2 -target x86_64-apple-macosx10.10 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -package-description-version 5";
				SWIFT_VERSION = 5.0;
				TARGETED_DEVICE_FAMILY = "1,2";
			};
			name = Debug;
		};
		OBJ_110 /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				CODE_SIGN_IDENTITY = "";
				LD = /usr/bin/true;
				MACOSX_DEPLOYMENT_TARGET = 11.0;
				OTHER_SWIFT_FLAGS = "-swift-version 5 -I $(TOOLCHAIN_DIR)/usr/lib/swift/pm/4_2 -target x86_64-apple-macosx10.10 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -package-description-version 5";
				SWIFT_VERSION = 5.0;
				TARGETED_DEVICE_FAMILY = "1,2";
			};
			name = Release;
		};
		OBJ_3 /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_COMMA = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
				CLANG_WARN_STRICT_PROTOTYPES = YES;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				COMBINE_HIDPI_IMAGES = YES;
				COPY_PHASE_STRIP = NO;
				DEBUG_INFORMATION_FORMAT = dwarf;
				DYLIB_INSTALL_NAME_BASE = "@rpath";
				ENABLE_NS_ASSERTIONS = YES;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				ENABLE_TESTABILITY = YES;
				ENABLE_USER_SCRIPT_SANDBOXING = YES;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_OPTIMIZATION_LEVEL = 0;
				GCC_PREPROCESSOR_DEFINITIONS = (
					"$(inherited)",
					"SWIFT_PACKAGE=1",
					"DEBUG=1",
				);
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
				MACOSX_DEPLOYMENT_TARGET = 10.10;
				ONLY_ACTIVE_ARCH = YES;
				OTHER_SWIFT_FLAGS = "$(inherited) -DXcode";
				PRODUCT_NAME = "$(TARGET_NAME)";
				SDKROOT = iphoneos;
				STRING_CATALOG_GENERATE_SYMBOLS = YES;
				SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator appletvos appletvsimulator watchos watchsimulator";
				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) SWIFT_PACKAGE DEBUG";
				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
				SWIFT_VERSION = 5.0;
				USE_HEADERMAP = NO;
			};
			name = Debug;
		};
		OBJ_4 /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_COMMA = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
				CLANG_WARN_STRICT_PROTOTYPES = YES;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				COMBINE_HIDPI_IMAGES = YES;
				COPY_PHASE_STRIP = YES;
				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
				DYLIB_INSTALL_NAME_BASE = "@rpath";
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				ENABLE_USER_SCRIPT_SANDBOXING = YES;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_OPTIMIZATION_LEVEL = s;
				GCC_PREPROCESSOR_DEFINITIONS = (
					"$(inherited)",
					"SWIFT_PACKAGE=1",
				);
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
				MACOSX_DEPLOYMENT_TARGET = 10.10;
				OTHER_SWIFT_FLAGS = "$(inherited) -DXcode";
				PRODUCT_NAME = "$(TARGET_NAME)";
				SDKROOT = iphoneos;
				STRING_CATALOG_GENERATE_SYMBOLS = YES;
				SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator appletvos appletvsimulator watchos watchsimulator";
				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) SWIFT_PACKAGE";
				SWIFT_COMPILATION_MODE = wholemodule;
				SWIFT_OPTIMIZATION_LEVEL = "-O";
				SWIFT_VERSION = 5.0;
				USE_HEADERMAP = NO;
			};
			name = Release;
		};
		OBJ_56 /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				CODE_SIGN_IDENTITY = "";
				CURRENT_PROJECT_VERSION = 48;
				ENABLE_TESTABILITY = YES;
				FRAMEWORK_SEARCH_PATHS = (
					"$(inherited)",
					"$(PLATFORM_DIR)/Developer/Library/Frameworks",
				);
				HEADER_SEARCH_PATHS = "$(inherited)";
				INFOPLIST_FILE = NVActivityIndicatorView.xcodeproj/NVActivityIndicatorView_Info.plist;
				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"$(TOOLCHAIN_DIR)/usr/lib/swift/macosx",
				);
				MACOSX_DEPLOYMENT_TARGET = 11.0;
				MARKETING_VERSION = 5.1.0;
				OTHER_CFLAGS = "$(inherited)";
				OTHER_LDFLAGS = "$(inherited)";
				OTHER_SWIFT_FLAGS = "$(inherited)";
				PRODUCT_BUNDLE_IDENTIFIER = NVActivityIndicatorView;
				PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)";
				PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
				SKIP_INSTALL = YES;
				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)";
				SWIFT_VERSION = 5.0;
				TARGETED_DEVICE_FAMILY = "1,2";
				TARGET_NAME = NVActivityIndicatorView;
				TVOS_DEPLOYMENT_TARGET = 12.0;
				WATCHOS_DEPLOYMENT_TARGET = 2.0;
			};
			name = Debug;
		};
		OBJ_57 /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				CODE_SIGN_IDENTITY = "";
				CURRENT_PROJECT_VERSION = 48;
				ENABLE_TESTABILITY = YES;
				FRAMEWORK_SEARCH_PATHS = (
					"$(inherited)",
					"$(PLATFORM_DIR)/Developer/Library/Frameworks",
				);
				HEADER_SEARCH_PATHS = "$(inherited)";
				INFOPLIST_FILE = NVActivityIndicatorView.xcodeproj/NVActivityIndicatorView_Info.plist;
				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"$(TOOLCHAIN_DIR)/usr/lib/swift/macosx",
				);
				MACOSX_DEPLOYMENT_TARGET = 11.0;
				MARKETING_VERSION = 5.1.0;
				OTHER_CFLAGS = "$(inherited)";
				OTHER_LDFLAGS = "$(inherited)";
				OTHER_SWIFT_FLAGS = "$(inherited)";
				PRODUCT_BUNDLE_IDENTIFIER = NVActivityIndicatorView;
				PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)";
				PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
				SKIP_INSTALL = YES;
				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)";
				SWIFT_VERSION = 5.0;
				TARGETED_DEVICE_FAMILY = "1,2";
				TARGET_NAME = NVActivityIndicatorView;
				TVOS_DEPLOYMENT_TARGET = 12.0;
				WATCHOS_DEPLOYMENT_TARGET = 2.0;
			};
			name = Release;
		};
		OBJ_99 /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				CODE_SIGN_IDENTITY = "";
				CURRENT_PROJECT_VERSION = 48;
				ENABLE_TESTABILITY = YES;
				FRAMEWORK_SEARCH_PATHS = (
					"$(inherited)",
					"$(PLATFORM_DIR)/Developer/Library/Frameworks",
				);
				HEADER_SEARCH_PATHS = "$(inherited)";
				INFOPLIST_FILE = NVActivityIndicatorView.xcodeproj/NVActivityIndicatorViewExtended_Info.plist;
				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"$(TOOLCHAIN_DIR)/usr/lib/swift/macosx",
				);
				MACOSX_DEPLOYMENT_TARGET = 11.0;
				MARKETING_VERSION = 5.1.0;
				OTHER_CFLAGS = "$(inherited)";
				OTHER_LDFLAGS = "$(inherited)";
				OTHER_SWIFT_FLAGS = "$(inherited)";
				PRODUCT_BUNDLE_IDENTIFIER = NVActivityIndicatorViewExtended;
				PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)";
				PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
				SKIP_INSTALL = YES;
				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)";
				SWIFT_VERSION = 5.0;
				TARGETED_DEVICE_FAMILY = "1,2";
				TARGET_NAME = NVActivityIndicatorViewExtended;
				TVOS_DEPLOYMENT_TARGET = 12.0;
				WATCHOS_DEPLOYMENT_TARGET = 2.0;
			};
			name = Debug;
		};
/* End XCBuildConfiguration section */

/* Begin XCConfigurationList section */
		1F1836F0248CEFC300583430 /* Build configuration list for PBXNativeTarget "Example" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				1F1836EE248CEFC300583430 /* Debug */,
				1F1836EF248CEFC300583430 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		1F183702248CF25600583430 /* Build configuration list for PBXNativeTarget "Tests" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				1F183703248CF25600583430 /* Debug */,
				1F183704248CF25600583430 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		OBJ_108 /* Build configuration list for PBXNativeTarget "NVActivityIndicatorViewPackageDescription" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				OBJ_109 /* Debug */,
				OBJ_110 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		OBJ_2 /* Build configuration list for PBXProject "NVActivityIndicatorView" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				OBJ_3 /* Debug */,
				OBJ_4 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		OBJ_55 /* Build configuration list for PBXNativeTarget "NVActivityIndicatorView" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				OBJ_56 /* Debug */,
				OBJ_57 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		OBJ_98 /* Build configuration list for PBXNativeTarget "NVActivityIndicatorViewExtended" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				OBJ_99 /* Debug */,
				OBJ_100 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
/* End XCConfigurationList section */

/* Begin XCRemoteSwiftPackageReference section */
		1F0742CF2F6A408300304500 /* XCRemoteSwiftPackageReference "SwiftLintPlugins" */ = {
			isa = XCRemoteSwiftPackageReference;
			repositoryURL = "https://github.com/SimplyDanny/SwiftLintPlugins";
			requirement = {
				kind = upToNextMajorVersion;
				minimumVersion = 0.63.2;
			};
		};
/* End XCRemoteSwiftPackageReference section */

/* Begin XCSwiftPackageProductDependency section */
		1F0742D02F6A40C600304500 /* SwiftLintBuildToolPlugin */ = {
			isa = XCSwiftPackageProductDependency;
			package = 1F0742CF2F6A408300304500 /* XCRemoteSwiftPackageReference "SwiftLintPlugins" */;
			productName = "plugin:SwiftLintBuildToolPlugin";
		};
		1F0742D22F6A40CF00304500 /* SwiftLintBuildToolPlugin */ = {
			isa = XCSwiftPackageProductDependency;
			package = 1F0742CF2F6A408300304500 /* XCRemoteSwiftPackageReference "SwiftLintPlugins" */;
			productName = "plugin:SwiftLintBuildToolPlugin";
		};
/* End XCSwiftPackageProductDependency section */
	};
	rootObject = OBJ_1 /* Project object */;
}


================================================
FILE: NVActivityIndicatorView.xcodeproj/project.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
   version = "1.0">
   <FileRef
      location = "self:">
   </FileRef>
</Workspace>

================================================
FILE: NVActivityIndicatorView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>IDEDidComputeMac32BitWarning</key>
	<true/>
</dict>
</plist>


================================================
FILE: NVActivityIndicatorView.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded</key>
    <false/>
</dict>
</plist>

================================================
FILE: NVActivityIndicatorView.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
================================================
{
  "originHash" : "1fa961aa1dc717cea452f3389668f0f99a254f07e4eb11d190768a53798f744f",
  "pins" : [
    {
      "identity" : "swiftlintplugins",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/SimplyDanny/SwiftLintPlugins",
      "state" : {
        "revision" : "8a4640d14777685ba8f14e832373160498fbab92",
        "version" : "0.63.2"
      }
    }
  ],
  "version" : 3
}


================================================
FILE: NVActivityIndicatorView.xcodeproj/xcshareddata/xcschemes/Example.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
   LastUpgradeVersion = "2630"
   version = "1.3">
   <BuildAction
      parallelizeBuildables = "YES"
      buildImplicitDependencies = "YES">
      <BuildActionEntries>
         <BuildActionEntry
            buildForTesting = "YES"
            buildForRunning = "YES"
            buildForProfiling = "YES"
            buildForArchiving = "YES"
            buildForAnalyzing = "YES">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "1F1836DC248CEFC200583430"
               BuildableName = "Example.app"
               BlueprintName = "Example"
               ReferencedContainer = "container:NVActivityIndicatorView.xcodeproj">
            </BuildableReference>
         </BuildActionEntry>
      </BuildActionEntries>
   </BuildAction>
   <TestAction
      buildConfiguration = "Debug"
      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
      shouldUseLaunchSchemeArgsEnv = "YES">
      <Testables>
         <TestableReference
            skipped = "NO">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "1F1836FA248CF25600583430"
               BuildableName = "Tests.xctest"
               BlueprintName = "Tests"
               ReferencedContainer = "container:NVActivityIndicatorView.xcodeproj">
            </BuildableReference>
         </TestableReference>
      </Testables>
   </TestAction>
   <LaunchAction
      buildConfiguration = "Debug"
      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
      launchStyle = "0"
      useCustomWorkingDirectory = "NO"
      ignoresPersistentStateOnLaunch = "NO"
      debugDocumentVersioning = "YES"
      debugServiceExtension = "internal"
      allowLocationSimulation = "YES">
      <BuildableProductRunnable
         runnableDebuggingMode = "0">
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "1F1836DC248CEFC200583430"
            BuildableName = "Example.app"
            BlueprintName = "Example"
            ReferencedContainer = "container:NVActivityIndicatorView.xcodeproj">
         </BuildableReference>
      </BuildableProductRunnable>
   </LaunchAction>
   <ProfileAction
      buildConfiguration = "Release"
      shouldUseLaunchSchemeArgsEnv = "YES"
      savedToolIdentifier = ""
      useCustomWorkingDirectory = "NO"
      debugDocumentVersioning = "YES">
      <BuildableProductRunnable
         runnableDebuggingMode = "0">
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "1F1836DC248CEFC200583430"
            BuildableName = "Example.app"
            BlueprintName = "Example"
            ReferencedContainer = "container:NVActivityIndicatorView.xcodeproj">
         </BuildableReference>
      </BuildableProductRunnable>
   </ProfileAction>
   <AnalyzeAction
      buildConfiguration = "Debug">
   </AnalyzeAction>
   <ArchiveAction
      buildConfiguration = "Release"
      revealArchiveInOrganizer = "YES">
   </ArchiveAction>
</Scheme>


================================================
FILE: NVActivityIndicatorView.xcodeproj/xcshareddata/xcschemes/NVActivityIndicatorView-Package.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
   LastUpgradeVersion = "2630"
   version = "1.3">
   <BuildAction
      parallelizeBuildables = "YES"
      buildImplicitDependencies = "YES">
      <BuildActionEntries>
         <BuildActionEntry
            buildForTesting = "YES"
            buildForRunning = "YES"
            buildForProfiling = "YES"
            buildForArchiving = "YES"
            buildForAnalyzing = "YES">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "NVActivityIndicatorView::NVActivityIndicatorView"
               BuildableName = "NVActivityIndicatorView.framework"
               BlueprintName = "NVActivityIndicatorView"
               ReferencedContainer = "container:NVActivityIndicatorView.xcodeproj">
            </BuildableReference>
         </BuildActionEntry>
         <BuildActionEntry
            buildForTesting = "YES"
            buildForRunning = "YES"
            buildForProfiling = "YES"
            buildForArchiving = "YES"
            buildForAnalyzing = "YES">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "NVActivityIndicatorView::NVActivityIndicatorViewExtended"
               BuildableName = "NVActivityIndicatorViewExtended.framework"
               BlueprintName = "NVActivityIndicatorViewExtended"
               ReferencedContainer = "container:NVActivityIndicatorView.xcodeproj">
            </BuildableReference>
         </BuildActionEntry>
      </BuildActionEntries>
   </BuildAction>
   <TestAction
      buildConfiguration = "Debug"
      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
      shouldUseLaunchSchemeArgsEnv = "YES">
      <Testables>
      </Testables>
   </TestAction>
   <LaunchAction
      buildConfiguration = "Debug"
      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
      launchStyle = "0"
      useCustomWorkingDirectory = "NO"
      ignoresPersistentStateOnLaunch = "NO"
      debugDocumentVersioning = "YES"
      debugServiceExtension = "internal"
      allowLocationSimulation = "YES">
   </LaunchAction>
   <ProfileAction
      buildConfiguration = "Release"
      shouldUseLaunchSchemeArgsEnv = "YES"
      savedToolIdentifier = ""
      useCustomWorkingDirectory = "NO"
      debugDocumentVersioning = "YES">
   </ProfileAction>
   <AnalyzeAction
      buildConfiguration = "Debug">
   </AnalyzeAction>
   <ArchiveAction
      buildConfiguration = "Release"
      revealArchiveInOrganizer = "YES">
   </ArchiveAction>
</Scheme>


================================================
FILE: Package.swift
================================================
// swift-tools-version:5.0
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "NVActivityIndicatorView",
    platforms: [
        .iOS(.v9),
        .tvOS(.v9)
    ],
    products: [
        .library(name: "NVActivityIndicatorView", targets: ["NVActivityIndicatorView"]),
        .library(name: "NVActivityIndicatorViewExtended", targets: ["NVActivityIndicatorViewExtended"])
    ],
    targets: [
        .target(name: "NVActivityIndicatorView", path: "Sources/Base"),
        .target(name: "NVActivityIndicatorViewExtended",
                dependencies: ["NVActivityIndicatorView"],
                path: "Sources/Extended")
    ]
)


================================================
FILE: PrivacyInfo.xcprivacy
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>NSPrivacyTracking</key>
	<false/>
</dict>
</plist>


================================================
FILE: README.md
================================================
# NVActivityIndicatorView

[![Build Status](https://github.com/ninjaprox/NVActivityIndicatorView/actions/workflows/ios.yml/badge.svg?event=push)](https://github.com/ninjaprox/NVActivityIndicatorView/actions/workflows/ios.yml)
[![Cocoapods Compatible](https://img.shields.io/cocoapods/v/NVActivityIndicatorView.svg)](https://img.shields.io/cocoapods/v/NVActivityIndicatorView.svg)
[![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)

⚠️ Check out [LoaderUI](https://github.com/ninjaprox/LoaderUI) (ready to use with Swift Package Mananger supported) for SwiftUI implementation of this. 🎉

## Introduction

`NVActivityIndicatorView` is a collection of awesome loading animations.

![Demo](https://raw.githubusercontent.com/ninjaprox/NVActivityIndicatorView/master/Demo.gif)

## Animation types

| Type                   | Type                        | Type                   | Type                       |
| ---------------------- | --------------------------- | ---------------------- | -------------------------- |
| 1. ballPulse           | 2. ballGridPulse            | 3. ballClipRotate      | 4. squareSpin              |
| 5. ballClipRotatePulse | 6. ballClipRotateMultiple   | 7. ballPulseRise       | 8. ballRotate              |
| 9. cubeTransition      | 10. ballZigZag              | 11. ballZigZagDeflect  | 12. ballTrianglePath       |
| 13. ballScale          | 14. lineScale               | 15. lineScaleParty     | 16. ballScaleMultiple      |
| 17. ballPulseSync      | 18. ballBeat                | 19. lineScalePulseOut  | 20. lineScalePulseOutRapid |
| 21. ballScaleRipple    | 22. ballScaleRippleMultiple | 23. ballSpinFadeLoader | 24. lineSpinFadeLoader     |
| 25. triangleSkewSpin   | 26. pacman                  | 27. ballGridBeat       | 28. semiCircleSpin         |
| 29. ballRotateChase    | 30. orbit                   | 31. audioEqualizer     | 32. circleStrokeSpin       |

## Installation

### Cocoapods

[Cocoapods](https://cocoapods.org/#install) is a dependency manager for Swift and Objective-C Cocoa projects. To use NVActivityIndicatorView with CocoaPods, add it in your `Podfile`.

```ruby
pod 'NVActivityIndicatorView'
```

### Carthage

[Carthage](https://github.com/Carthage/Carthage#installing-carthage) is intended to be the simplest way to add frameworks to your Cocoa application. To use NVActivityIndicatorView with Carthage, add it in your `Cartfile`.

```ruby
github "ninjaprox/NVActivityIndicatorView"
```

### Swift Package Manager

The [Swift Package Manager](https://swift.org/package-manager/) is a tool for managing the distribution of Swift code. To use NVActivityIndicatorView with Swift Package Manger, add it to `dependencies` in your `Package.swift`

```swift
dependencies: [
    .package(url: "https://github.com/ninjaprox/NVActivityIndicatorView.git")
]
```

## Migration

Version [5.0.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/5.0.0) comes with breaking changes. Please refer to the release note for details.

## Usage

Firstly, import `NVActivityIndicatorView`.

```swift
import NVActivityIndicatorView
```

### Initialization

Then, there are two ways you can create `NVActivityIndicatorView`:

-   By storyboard, changing class of any `UIView` to `NVActivityIndicatorView`.

_**Note:** Set `Module` to `NVActivityIndicatorView`._

-   By code, using initializer. All parameters other than `frame` are optional and [`NVActivityIndicatorView.DEFAULT_*`](https://nvactivityindicatorview.vinhis.me/Classes/NVActivityIndicatorView.html) are used as default values.

```swift
NVActivityIndicatorView(frame: frame, type: type, color: color, padding: padding)
```

### Control

Start animating.

```swift
activityIndicatorView.startAnimating()
```

Stop animating.

```swift
activityIndicatorView.stopAnimating()
```

Determine if it is animating.

```swift
animating = activityIndicatorView.isAnimating
```

### Change properties

In storyboard, you can change all properties in Attributes inspector tab of Utilities panel.

_**Note:** Use one of values (case-insensitive) in [Animation types](#animation-types) for `Type Name`._

All properties are public so you can change them after initializing.

_**Note:** All changes must be made before calling `startAnimating()`._

## Documentation

https://nvactivityindicatorview.vinhis.me/

## Acknowledgment

Thanks [Connor Atherton](https://github.com/ConnorAtherton) for inspired [Loaders.css](https://github.com/ConnorAtherton/loaders.css) and [Danil Gontovnik](https://github.com/gontovnik) for [DGActivityIndicatorView](https://github.com/gontovnik/DGActivityIndicatorView).

## License

The MIT License (MIT)

Copyright (c) 2016 Vinh Nguyen [@ninjaprox](http://twitter.com/ninjaprox)


================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationAudioEqualizer.swift
================================================
//
//  NVActivityIndicatorAnimationAudioEqualizer.swift
//  NVActivityIndicatorView
//
// The MIT License (MIT)

// Copyright (c) 2016 Vinh Nguyen

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//

#if canImport(UIKit)
import UIKit

class NVActivityIndicatorAnimationAudioEqualizer: NVActivityIndicatorAnimationDelegate {

    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
        let lineSize = size.width / 9
        let x = (layer.bounds.size.width - lineSize * 7) / 2
        let y = (layer.bounds.size.height - size.height) / 2
        let duration: [CFTimeInterval] = [4.3, 2.5, 1.7, 3.1]
        let values = [0, 0.7, 0.4, 0.05, 0.95, 0.3, 0.9, 0.4, 0.15, 0.18, 0.75, 0.01]

        // Draw lines
        for i in 0 ..< 4 {
            let animation = CAKeyframeAnimation()

            animation.keyPath = "path"
            animation.isAdditive = true
            animation.values = []

            for j in 0 ..< values.count {
                let heightFactor = values[j]
                let height = size.height * CGFloat(heightFactor)
                let point = CGPoint(x: 0, y: size.height - height)
                let path = UIBezierPath(rect: CGRect(origin: point, size: CGSize(width: lineSize, height: height)))

                animation.values?.append(path.cgPath)
            }
            animation.duration = duration[i]
            animation.repeatCount = HUGE
            animation.isRemovedOnCompletion = false

            let line = NVActivityIndicatorShape.line.layerWith(size: CGSize(width: lineSize, height: size.height), color: color)
            let frame = CGRect(x: x + lineSize * 2 * CGFloat(i),
                               y: y,
                               width: lineSize,
                               height: size.height)

            line.frame = frame
            line.add(animation, forKey: "animation")
            layer.addSublayer(line)
        }
    }
}
#endif


================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallBeat.swift
================================================
//
//  NVActivityIndicatorAnimationBallBeat.swift
//  NVActivityIndicatorView
//
// The MIT License (MIT)

// Copyright (c) 2016 Vinh Nguyen

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//

#if canImport(UIKit)
import UIKit

class NVActivityIndicatorAnimationBallBeat: NVActivityIndicatorAnimationDelegate {

    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
        let circleSpacing: CGFloat = 2
        let circleSize = (size.width - circleSpacing * 2) / 3
        let x = (layer.bounds.size.width - size.width) / 2
        let y = (layer.bounds.size.height - circleSize) / 2
        let duration: CFTimeInterval = 0.7
        let beginTime = CACurrentMediaTime()
        let beginTimes = [0.35, 0, 0.35]

        // Scale animation
        let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale")

        scaleAnimation.keyTimes = [0, 0.5, 1]
        scaleAnimation.values = [1, 0.75, 1]
        scaleAnimation.duration = duration

        // Opacity animation
        let opacityAnimation = CAKeyframeAnimation(keyPath: "opacity")

        opacityAnimation.keyTimes = [0, 0.5, 1]
        opacityAnimation.values = [1, 0.2, 1]
        opacityAnimation.duration = duration

        // Aniamtion
        let animation = CAAnimationGroup()

        animation.animations = [scaleAnimation, opacityAnimation]
        animation.timingFunction = CAMediaTimingFunction(name: .linear)
        animation.duration = duration
        animation.repeatCount = HUGE
        animation.isRemovedOnCompletion = false

        // Draw circles
        for i in 0 ..< 3 {
            let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)
            let frame = CGRect(x: x + circleSize * CGFloat(i) + circleSpacing * CGFloat(i),
                               y: y,
                               width: circleSize,
                               height: circleSize)

            animation.beginTime = beginTime + beginTimes[i]
            circle.frame = frame
            circle.add(animation, forKey: "animation")
            layer.addSublayer(circle)
        }
    }
}
#endif


================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallClipRotate.swift
================================================
//
//  NVActivityIndicatorBallClipRotate.swift
//  NVActivityIndicatorView
//
// The MIT License (MIT)

// Copyright (c) 2016 Vinh Nguyen

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//

#if canImport(UIKit)
import UIKit

class NVActivityIndicatorAnimationBallClipRotate: NVActivityIndicatorAnimationDelegate {

    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
        let duration: CFTimeInterval = 0.75

        //    Scale animation
        let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale")

        scaleAnimation.keyTimes = [0, 0.5, 1]
        scaleAnimation.values = [1, 0.6, 1]

        // Rotate animation
        let rotateAnimation = CAKeyframeAnimation(keyPath: "transform.rotation.z")

        rotateAnimation.keyTimes = scaleAnimation.keyTimes
        rotateAnimation.values = [0, Double.pi, 2 * Double.pi]

        // Animation
        let animation = CAAnimationGroup()

        animation.animations = [scaleAnimation, rotateAnimation]
        animation.timingFunction = CAMediaTimingFunction(name: .linear)
        animation.duration = duration
        animation.repeatCount = HUGE
        animation.isRemovedOnCompletion = false

        // Draw circle
        let circle = NVActivityIndicatorShape.ringThirdFour.layerWith(size: CGSize(width: size.width, height: size.height), color: color)
        let frame = CGRect(x: (layer.bounds.size.width - size.width) / 2,
                           y: (layer.bounds.size.height - size.height) / 2,
                           width: size.width,
                           height: size.height)

        circle.frame = frame
        circle.add(animation, forKey: "animation")
        layer.addSublayer(circle)
    }
}
#endif


================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallClipRotateMultiple.swift
================================================
//
//  NVActivityIndicatorAnimationBallClipRotateMultiple.swift
//  NVActivityIndicatorView
//
// The MIT License (MIT)

// Copyright (c) 2016 Vinh Nguyen

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//

#if canImport(UIKit)
import UIKit

class NVActivityIndicatorAnimationBallClipRotateMultiple: NVActivityIndicatorAnimationDelegate {

    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
        let bigCircleSize: CGFloat = size.width
        let smallCircleSize: CGFloat = size.width / 2
        let longDuration: CFTimeInterval = 1
        let timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)

        circleOf(shape: .ringTwoHalfHorizontal,
                 duration: longDuration,
                 timingFunction: timingFunction,
                 layer: layer,
                 size: bigCircleSize,
                 color: color, reverse: false)
        circleOf(shape: .ringTwoHalfVertical,
                 duration: longDuration,
                 timingFunction: timingFunction,
                 layer: layer,
                 size: smallCircleSize,
                 color: color, reverse: true)
    }

    func createAnimationIn(duration: CFTimeInterval, timingFunction: CAMediaTimingFunction, reverse: Bool) -> CAAnimation {
        // Scale animation
        let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale")

        scaleAnimation.keyTimes = [0, 0.5, 1]
        scaleAnimation.timingFunctions = [timingFunction, timingFunction]
        scaleAnimation.values = [1, 0.6, 1]
        scaleAnimation.duration = duration

        // Rotate animation
        let rotateAnimation = CAKeyframeAnimation(keyPath: "transform.rotation.z")

        rotateAnimation.keyTimes = scaleAnimation.keyTimes
        rotateAnimation.timingFunctions = [timingFunction, timingFunction]
        if !reverse {
            rotateAnimation.values = [0, Double.pi, 2 * Double.pi]
        } else {
            rotateAnimation.values = [0, -Double.pi, -2 * Double.pi]
        }
        rotateAnimation.duration = duration

        // Animation
        let animation = CAAnimationGroup()

        animation.animations = [scaleAnimation, rotateAnimation]
        animation.duration = duration
        animation.repeatCount = HUGE
        animation.isRemovedOnCompletion = false

        return animation
    }

    // swiftlint:disable:next function_parameter_count
    func circleOf(shape: NVActivityIndicatorShape, duration: CFTimeInterval, timingFunction: CAMediaTimingFunction, layer: CALayer, size: CGFloat, color: UIColor, reverse: Bool) {
        let circle = shape.layerWith(size: CGSize(width: size, height: size), color: color)
        let frame = CGRect(x: (layer.bounds.size.width - size) / 2,
                           y: (layer.bounds.size.height - size) / 2,
                           width: size,
                           height: size)
        let animation = createAnimationIn(duration: duration, timingFunction: timingFunction, reverse: reverse)

        circle.frame = frame
        circle.add(animation, forKey: "animation")
        layer.addSublayer(circle)
    }
}
#endif


================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallClipRotatePulse.swift
================================================
//
//  NVActivityIndicatorAnimationBallClipRotatePulse.swift
//  NVActivityIndicatorView
//
// The MIT License (MIT)

// Copyright (c) 2016 Vinh Nguyen

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//

#if canImport(UIKit)
import UIKit

class NVActivityIndicatorAnimationBallClipRotatePulse: NVActivityIndicatorAnimationDelegate {

    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
        let duration: CFTimeInterval = 1
        let timingFunction = CAMediaTimingFunction(controlPoints: 0.09, 0.57, 0.49, 0.9)

        smallCircleWith(duration: duration, timingFunction: timingFunction, layer: layer, size: size, color: color)
        bigCircleWith(duration: duration, timingFunction: timingFunction, layer: layer, size: size, color: color)
    }

    func smallCircleWith(duration: CFTimeInterval, timingFunction: CAMediaTimingFunction, layer: CALayer, size: CGSize, color: UIColor) {
        // Animation
        let animation = CAKeyframeAnimation(keyPath: "transform.scale")

        animation.keyTimes = [0, 0.3, 1]
        animation.timingFunctions = [timingFunction, timingFunction]
        animation.values = [1, 0.3, 1]
        animation.duration = duration
        animation.repeatCount = HUGE
        animation.isRemovedOnCompletion = false

        // Draw circle
        let circleSize = size.width / 2
        let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)
        let frame = CGRect(x: (layer.bounds.size.width - circleSize) / 2,
                           y: (layer.bounds.size.height - circleSize) / 2,
                           width: circleSize,
                           height: circleSize)

        circle.frame = frame
        circle.add(animation, forKey: "animation")
        layer.addSublayer(circle)
    }

    func bigCircleWith(duration: CFTimeInterval, timingFunction: CAMediaTimingFunction, layer: CALayer, size: CGSize, color: UIColor) {
        // Scale animation
        let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale")

        scaleAnimation.keyTimes = [0, 0.5, 1]
        scaleAnimation.timingFunctions = [timingFunction, timingFunction]
        scaleAnimation.values = [1, 0.6, 1]
        scaleAnimation.duration = duration

        // Rotate animation
        let rotateAnimation = CAKeyframeAnimation(keyPath: "transform.rotation.z")

        rotateAnimation.keyTimes = scaleAnimation.keyTimes
        rotateAnimation.timingFunctions = [timingFunction, timingFunction]
        rotateAnimation.values = [0, Double.pi, 2 * Double.pi]
        rotateAnimation.duration = duration

        // Animation
        let animation = CAAnimationGroup()

        animation.animations = [scaleAnimation, rotateAnimation]
        animation.duration = duration
        animation.repeatCount = HUGE
        animation.isRemovedOnCompletion = false

        // Draw circle
        let circle = NVActivityIndicatorShape.ringTwoHalfVertical.layerWith(size: size, color: color)
        let frame = CGRect(x: (layer.bounds.size.width - size.width) / 2,
                           y: (layer.bounds.size.height - size.height) / 2,
                           width: size.width,
                           height: size.height)
        circle.frame = frame
        circle.add(animation, forKey: "animation")
        layer.addSublayer(circle)
    }
}
#endif


================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallDoubleBounce.swift
================================================
//
//  NVActivityIndicatorAnimationBallsBounce.swift
//  NVActivityIndicatorView
//
// The MIT License (MIT)

// Copyright (c) 2016 Vinh Nguyen

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//

#if canImport(UIKit)
import UIKit

class NVActivityIndicatorAnimationBallDoubleBounce: NVActivityIndicatorAnimationDelegate {

    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
        for index in (0...1) {
            bouncingBall(in: layer, size: size, color: color, startingAt: CACurrentMediaTime() + Double(index))
        }
    }

    fileprivate func bouncingBall(in layer: CALayer, size: CGSize, color: UIColor, startingAt: CFTimeInterval) {
        // Scale animation
        let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale")
        scaleAnimation.duration = 2
        scaleAnimation.keyTimes = [0, 0.5, 1]
        scaleAnimation.values = [-1, 0, -1]

        scaleAnimation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
        scaleAnimation.repeatCount = HUGE
        scaleAnimation.isRemovedOnCompletion = false

        let circle = NVActivityIndicatorShape.circle.layerWith(size: size, color: color)
        let frame = CGRect(x: (layer.bounds.size.width - size.width) / 2,
                           y: (layer.bounds.size.height - size.height) / 2,
                           width: size.width,
                           height: size.height)

        scaleAnimation.beginTime = startingAt
        circle.frame = frame
        circle.opacity = 0.6
        circle.add(scaleAnimation, forKey: "animation")
        layer.addSublayer(circle)
    }
}
#endif


================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallGridBeat.swift
================================================
//
//  NVActivityIndicatorAnimationBallGridBeat.swift
//  NVActivityIndicatorView
//
// The MIT License (MIT)

// Copyright (c) 2016 Vinh Nguyen

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//

#if canImport(UIKit)
import UIKit

class NVActivityIndicatorAnimationBallGridBeat: NVActivityIndicatorAnimationDelegate {

    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
        let circleSpacing: CGFloat = 2
        let circleSize = (size.width - circleSpacing * 2) / 3
        let x = (layer.bounds.size.width - size.width) / 2
        let y = (layer.bounds.size.height - size.height) / 2
        let durations = [0.96, 0.93, 1.19, 1.13, 1.34, 0.94, 1.2, 0.82, 1.19]
        let beginTime = CACurrentMediaTime()
        let beginTimes = [0.36, 0.4, 0.68, 0.41, 0.71, -0.15, -0.12, 0.01, 0.32]
        let timingFunction = CAMediaTimingFunction(name: .default)

        // Animation
        let animation = CAKeyframeAnimation(keyPath: "opacity")

        animation.keyTimes = [0, 0.5, 1]
        animation.timingFunctions = [timingFunction, timingFunction]
        animation.values = [1, 0.7, 1]
        animation.repeatCount = HUGE
        animation.isRemovedOnCompletion = false

        // Draw circles
        for i in 0 ..< 3 {
            for j in 0 ..< 3 {
                let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)
                let frame = CGRect(x: x + circleSize * CGFloat(j) + circleSpacing * CGFloat(j),
                                   y: y + circleSize * CGFloat(i) + circleSpacing * CGFloat(i),
                                   width: circleSize,
                                   height: circleSize)

                animation.duration = durations[3 * i + j]
                animation.beginTime = beginTime + beginTimes[3 * i + j]
                circle.frame = frame
                circle.add(animation, forKey: "animation")
                layer.addSublayer(circle)
            }
        }
    }
}
#endif


================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallGridPulse.swift
================================================
//
//  NVActivityIndicatorAnimationBallGridPulse.swift
//  NVActivityIndicatorView
//
// The MIT License (MIT)

// Copyright (c) 2016 Vinh Nguyen

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//

#if canImport(UIKit)
import UIKit

class NVActivityIndicatorAnimationBallGridPulse: NVActivityIndicatorAnimationDelegate {

    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
        let circleSpacing: CGFloat = 2
        let circleSize = (size.width - circleSpacing * 2) / 3
        let x = (layer.bounds.size.width - size.width) / 2
        let y = (layer.bounds.size.height - size.height) / 2
        let durations: [CFTimeInterval] = [0.72, 1.02, 1.28, 1.42, 1.45, 1.18, 0.87, 1.45, 1.06]
        let beginTime = CACurrentMediaTime()
        let beginTimes: [CFTimeInterval] = [ -0.06, 0.25, -0.17, 0.48, 0.31, 0.03, 0.46, 0.78, 0.45]
        let timingFunction = CAMediaTimingFunction(name: .default)

        // Scale animation
        let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale")

        scaleAnimation.keyTimes = [0, 0.5, 1]
        scaleAnimation.timingFunctions = [timingFunction, timingFunction]
        scaleAnimation.values = [1, 0.5, 1]

        // Opacity animation
        let opacityAnimation = CAKeyframeAnimation(keyPath: "opacity")

        opacityAnimation.keyTimes = [0, 0.5, 1]
        opacityAnimation.timingFunctions = [timingFunction, timingFunction]
        opacityAnimation.values = [1, 0.7, 1]

        // Animation
        let animation = CAAnimationGroup()

        animation.animations = [scaleAnimation, opacityAnimation]
        animation.repeatCount = HUGE
        animation.isRemovedOnCompletion = false

        // Draw circles
        for i in 0 ..< 3 {
            for j in 0 ..< 3 {
                let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)
                let frame = CGRect(x: x + circleSize * CGFloat(j) + circleSpacing * CGFloat(j),
                                   y: y + circleSize * CGFloat(i) + circleSpacing * CGFloat(i),
                                   width: circleSize,
                                   height: circleSize)

                animation.duration = durations[3 * i + j]
                animation.beginTime = beginTime + beginTimes[3 * i + j]
                circle.frame = frame
                circle.add(animation, forKey: "animation")
                layer.addSublayer(circle)
            }
        }
    }
}
#endif


================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallPulse.swift
================================================
//
//  NVActivityIndicatorAnimationBallPulse.swift
//  NVActivityIndicatorView
//
// The MIT License (MIT)

// Copyright (c) 2016 Vinh Nguyen

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//

#if canImport(UIKit)
import UIKit

class NVActivityIndicatorAnimationBallPulse: NVActivityIndicatorAnimationDelegate {
    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
        let circleSpacing: CGFloat = 2
        let circleSize: CGFloat = (size.width - 2 * circleSpacing) / 3
        let x: CGFloat = (layer.bounds.size.width - size.width) / 2
        let y: CGFloat = (layer.bounds.size.height - circleSize) / 2
        let duration: CFTimeInterval = 0.75
        let beginTime = CACurrentMediaTime()
        let beginTimes: [CFTimeInterval] = [0.12, 0.24, 0.36]
        let timingFunction = CAMediaTimingFunction(controlPoints: 0.2, 0.68, 0.18, 1.08)
        let animation = CAKeyframeAnimation(keyPath: "transform.scale")

        // Animation
        animation.keyTimes = [0, 0.3, 1]
        animation.timingFunctions = [timingFunction, timingFunction]
        animation.values = [1, 0.3, 1]
        animation.duration = duration
        animation.repeatCount = HUGE
        animation.isRemovedOnCompletion = false

        // Draw circles
        for i in 0 ..< 3 {
            let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)
            let frame = CGRect(x: x + circleSize * CGFloat(i) + circleSpacing * CGFloat(i),
                               y: y,
                               width: circleSize,
                               height: circleSize)

            animation.beginTime = beginTime + beginTimes[i]
            circle.frame = frame
            circle.add(animation, forKey: "animation")
            layer.addSublayer(circle)
        }
    }
}
#endif


================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallPulseRise.swift
================================================
//
//  NVActivityIndicatorAnimationBallPulseRise.swift
//  NVActivityIndicatorView
//
// The MIT License (MIT)

// Copyright (c) 2016 Vinh Nguyen

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//

#if canImport(UIKit)
import UIKit

class NVActivityIndicatorAnimationBallPulseRise: NVActivityIndicatorAnimationDelegate {

    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
        let circleSpacing: CGFloat = 2
        let circleSize = (size.width - 4 * circleSpacing) / 5
        let x = (layer.bounds.size.width - size.width) / 2
        let y = (layer.bounds.size.height - circleSize) / 2
        let deltaY = size.height / 2
        let duration: CFTimeInterval = 1
        let timingFunction = CAMediaTimingFunction(controlPoints: 0.15, 0.46, 0.9, 0.6)
        let oddAnimation = self.oddAnimation(duration: duration, deltaY: deltaY, timingFunction: timingFunction)
        let evenAnimation = self.evenAnimation(duration: duration, deltaY: deltaY, timingFunction: timingFunction)

        // Draw circles
        for i in 0 ..< 5 {
            let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)
            let frame = CGRect(x: x + circleSize * CGFloat(i) + circleSpacing * CGFloat(i),
                               y: y,
                               width: circleSize,
                               height: circleSize)

            circle.frame = frame
            if i % 2 == 0 {
                circle.add(evenAnimation, forKey: "animation")
            } else {
                circle.add(oddAnimation, forKey: "animation")
            }
            layer.addSublayer(circle)
        }
    }

    func oddAnimation(duration: CFTimeInterval, deltaY: CGFloat, timingFunction: CAMediaTimingFunction) -> CAAnimation {
        // Scale animation
        let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale")

        scaleAnimation.keyTimes = [0, 0.5, 1]
        scaleAnimation.timingFunctions = [timingFunction, timingFunction]
        scaleAnimation.values = [0.4, 1.1, 0.75]
        scaleAnimation.duration = duration

        // Translate animation
        let translateAnimation = CAKeyframeAnimation(keyPath: "transform.translation.y")

        translateAnimation.keyTimes = [0, 0.25, 0.75, 1]
        translateAnimation.timingFunctions = [timingFunction, timingFunction, timingFunction]
        translateAnimation.values = [0, deltaY, -deltaY, 0]
        translateAnimation.duration = duration

        let animation = CAAnimationGroup()

        animation.animations = [scaleAnimation, translateAnimation]
        animation.duration = duration
        animation.repeatCount = HUGE
        animation.isRemovedOnCompletion = false

        return animation
    }

    func evenAnimation(duration: CFTimeInterval, deltaY: CGFloat, timingFunction: CAMediaTimingFunction) -> CAAnimation {
        // Scale animation
        let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale")

        scaleAnimation.keyTimes = [0, 0.5, 1]
        scaleAnimation.timingFunctions = [timingFunction, timingFunction]
        scaleAnimation.values = [1.1, 0.4, 1]
        scaleAnimation.duration = duration

        // Translate animation
        let translateAnimation = CAKeyframeAnimation(keyPath: "transform.translation.y")

        translateAnimation.keyTimes = [0, 0.25, 0.75, 1]
        translateAnimation.timingFunctions = [timingFunction, timingFunction, timingFunction]
        translateAnimation.values = [0, -deltaY, deltaY, 0]
        translateAnimation.duration = duration

        let animation = CAAnimationGroup()

        animation.animations = [scaleAnimation, translateAnimation]
        animation.duration = duration
        animation.repeatCount = HUGE
        animation.isRemovedOnCompletion = false

        return animation
    }
}
#endif


================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallPulseSync.swift
================================================
//
//  NVActivityIndicatorAnimationBallPulseSync.swift
//  NVActivityIndicatorView
//
// The MIT License (MIT)

// Copyright (c) 2016 Vinh Nguyen

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//

#if canImport(UIKit)
import UIKit

class NVActivityIndicatorAnimationBallPulseSync: NVActivityIndicatorAnimationDelegate {

    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
        let circleSpacing: CGFloat = 2
        let circleSize = (size.width - circleSpacing * 2) / 3
        let x = (layer.bounds.size.width - size.width) / 2
        let y = (layer.bounds.size.height - circleSize) / 2
        let deltaY = (size.height / 2 - circleSize / 2) / 2
        let duration: CFTimeInterval = 0.6
        let beginTime = CACurrentMediaTime()
        let beginTimes: [CFTimeInterval] = [0.07, 0.14, 0.21]
        let timingFunciton = CAMediaTimingFunction(name: .easeInEaseOut)

        // Animation
        let animation = CAKeyframeAnimation(keyPath: "transform.translation.y")

        animation.keyTimes = [0, 0.33, 0.66, 1]
        animation.timingFunctions = [timingFunciton, timingFunciton, timingFunciton]
        animation.values = [0, deltaY, -deltaY, 0]
        animation.duration = duration
        animation.repeatCount = HUGE
        animation.isRemovedOnCompletion = false

        // Draw circles
        for i in 0 ..< 3 {
            let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)
            let frame = CGRect(x: x + circleSize * CGFloat(i) + circleSpacing * CGFloat(i),
                               y: y,
                               width: circleSize,
                               height: circleSize)

            animation.beginTime = beginTime + beginTimes[i]
            circle.frame = frame
            circle.add(animation, forKey: "animation")
            layer.addSublayer(circle)
        }
    }
}
#endif


================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallRotate.swift
================================================
//
//  NVActivityIndicatorAnimationBallRotate.swift
//  NVActivityIndicatorView
//
// The MIT License (MIT)

// Copyright (c) 2016 Vinh Nguyen

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//

#if canImport(UIKit)
import UIKit

class NVActivityIndicatorAnimationBallRotate: NVActivityIndicatorAnimationDelegate {

    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
        let circleSize: CGFloat = size.width / 5
        let duration: CFTimeInterval = 1
        let timingFunction = CAMediaTimingFunction(controlPoints: 0.7, -0.13, 0.22, 0.86)

        // Scale animation
        let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale")

        scaleAnimation.keyTimes = [0, 0.5, 1]
        scaleAnimation.timingFunctions = [timingFunction, timingFunction]
        scaleAnimation.values = [1, 0.6, 1]
        scaleAnimation.duration = duration

        // Rotate animation
        let rotateAnimation = CAKeyframeAnimation(keyPath: "transform.rotation.z")

        rotateAnimation.keyTimes = [0, 0.5, 1]
        rotateAnimation.timingFunctions = [timingFunction, timingFunction]
        rotateAnimation.values = [0, Double.pi, 2 * Double.pi]
        rotateAnimation.duration = duration

        // Animation
        let animation = CAAnimationGroup()

        animation.animations = [scaleAnimation, rotateAnimation]
        animation.duration = duration
        animation.repeatCount = HUGE
        animation.isRemovedOnCompletion = false

        // Draw circles
        let leftCircle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)
        let rightCircle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)
        let centerCircle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)

        leftCircle.opacity = 0.8
        leftCircle.frame = CGRect(x: 0, y: (size.height - circleSize) / 2, width: circleSize, height: circleSize)
        rightCircle.opacity = 0.8
        rightCircle.frame = CGRect(x: size.width - circleSize, y: (size.height - circleSize) / 2, width: circleSize, height: circleSize)
        centerCircle.frame = CGRect(x: (size.width - circleSize) / 2, y: (size.height - circleSize) / 2, width: circleSize, height: circleSize)

        let circle = CALayer()
        let frame = CGRect(x: (layer.bounds.size.width - size.width) / 2, y: (layer.bounds.size.height - size.height) / 2, width: size.width, height: size.height)

        circle.frame = frame
        circle.addSublayer(leftCircle)
        circle.addSublayer(rightCircle)
        circle.addSublayer(centerCircle)
        circle.add(animation, forKey: "animation")
        layer.addSublayer(circle)
    }
}
#endif


================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallRotateChase.swift
================================================
//
//  NVActivityIndicatorAnimationBallRotateChase.swift
//  NVActivityIndicatorView
//
// The MIT License (MIT)

// Copyright (c) 2016 Vinh Nguyen

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//

#if canImport(UIKit)
import UIKit

class NVActivityIndicatorAnimationBallRotateChase: NVActivityIndicatorAnimationDelegate {

    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
        let circleSize = size.width / 5

        // Draw circles
        for i in 0 ..< 5 {
            let factor = Float(i) * 1 / 5
            let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)
            let animation = rotateAnimation(factor, x: layer.bounds.size.width / 2, y: layer.bounds.size.height / 2, size: CGSize(width: size.width - circleSize, height: size.height - circleSize))

            circle.frame = CGRect(x: 0, y: 0, width: circleSize, height: circleSize)
            circle.add(animation, forKey: "animation")
            layer.addSublayer(circle)
        }
    }

    func rotateAnimation(_ rate: Float, x: CGFloat, y: CGFloat, size: CGSize) -> CAAnimationGroup {
        let duration: CFTimeInterval = 1.5
        let fromScale = 1 - rate
        let toScale = 0.2 + rate
        let timeFunc = CAMediaTimingFunction(controlPoints: 0.5, 0.15 + rate, 0.25, 1)

        // Scale animation
        let scaleAnimation = CABasicAnimation(keyPath: "transform.scale")
        scaleAnimation.duration = duration
        scaleAnimation.repeatCount = HUGE
        scaleAnimation.fromValue = fromScale
        scaleAnimation.toValue = toScale

        // Position animation
        let positionAnimation = CAKeyframeAnimation(keyPath: "position")
        positionAnimation.duration = duration
        positionAnimation.repeatCount = HUGE
        positionAnimation.path = UIBezierPath(arcCenter: CGPoint(x: x, y: y), radius: size.width / 2, startAngle: CGFloat(3 * Double.pi * 0.5), endAngle: CGFloat(3 * Double.pi * 0.5 + 2 * Double.pi), clockwise: true).cgPath

        // Aniamtion
        let animation = CAAnimationGroup()
        animation.animations = [scaleAnimation, positionAnimation]
        animation.timingFunction = timeFunc
        animation.duration = duration
        animation.repeatCount = HUGE
        animation.isRemovedOnCompletion = false

        return animation
    }
}
#endif


================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallScale.swift
================================================
//
//  NVActivityIndicatorAnimationBallScale.swift
//  NVActivityIndicatorView
//
// The MIT License (MIT)

// Copyright (c) 2016 Vinh Nguyen

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//

#if canImport(UIKit)
import UIKit

class NVActivityIndicatorAnimationBallScale: NVActivityIndicatorAnimationDelegate {

    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
        let duration: CFTimeInterval = 1

        // Scale animation
        let scaleAnimation = CABasicAnimation(keyPath: "transform.scale")

        scaleAnimation.duration = duration
        scaleAnimation.fromValue = 0
        scaleAnimation.toValue = 1

        // Opacity animation
        let opacityAnimation = CABasicAnimation(keyPath: "opacity")

        opacityAnimation.duration = duration
        opacityAnimation.fromValue = 1
        opacityAnimation.toValue = 0

        // Animation
        let animation = CAAnimationGroup()

        animation.animations = [scaleAnimation, opacityAnimation]
        animation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
        animation.duration = duration
        animation.repeatCount = HUGE
        animation.isRemovedOnCompletion = false

        // Draw circle
        let circle = NVActivityIndicatorShape.circle.layerWith(size: size, color: color)

        circle.frame = CGRect(x: (layer.bounds.size.width - size.width) / 2,
                              y: (layer.bounds.size.height - size.height) / 2,
                              width: size.width,
                              height: size.height)
        circle.add(animation, forKey: "animation")
        layer.addSublayer(circle)
    }
}
#endif


================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallScaleMultiple.swift
================================================
//
//  NVActivityIndicatorAnimationBallScaleMultiple.swift
//  NVActivityIndicatorView
//
// The MIT License (MIT)

// Copyright (c) 2016 Vinh Nguyen

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//

#if canImport(UIKit)
import UIKit

class NVActivityIndicatorAnimationBallScaleMultiple: NVActivityIndicatorAnimationDelegate {

    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
        let duration: CFTimeInterval = 1
        let beginTime = CACurrentMediaTime()
        let beginTimes = [0, 0.2, 0.4]

        // Scale animation
        let scaleAnimation = CABasicAnimation(keyPath: "transform.scale")

        scaleAnimation.duration = duration
        scaleAnimation.fromValue = 0
        scaleAnimation.toValue = 1

        // Opacity animation
        let opacityAnimation = CAKeyframeAnimation(keyPath: "opacity")

        opacityAnimation.duration = duration
        opacityAnimation.keyTimes = [0, 0.05, 1]
        opacityAnimation.values = [0, 1, 0]

        // Animation
        let animation = CAAnimationGroup()

        animation.animations = [scaleAnimation, opacityAnimation]
        animation.timingFunction = CAMediaTimingFunction(name: .linear)
        animation.duration = duration
        animation.repeatCount = HUGE
        animation.isRemovedOnCompletion = false

        // Draw balls
        for i in 0 ..< 3 {
            let circle = NVActivityIndicatorShape.circle.layerWith(size: size, color: color)
            let frame = CGRect(x: (layer.bounds.size.width - size.width) / 2,
                               y: (layer.bounds.size.height - size.height) / 2,
                               width: size.width,
                               height: size.height)

            animation.beginTime = beginTime + beginTimes[i]
            circle.frame = frame
            circle.opacity = 0
            circle.add(animation, forKey: "animation")
            layer.addSublayer(circle)
        }
    }
}
#endif


================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallScaleRipple.swift
================================================
//
//  NVActivityIndicatorAnimationBallScaleRipple.swift
//  NVActivityIndicatorView
//
// The MIT License (MIT)

// Copyright (c) 2016 Vinh Nguyen

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//

#if canImport(UIKit)
import UIKit

class NVActivityIndicatorAnimationBallScaleRipple: NVActivityIndicatorAnimationDelegate {

    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
        let duration: CFTimeInterval = 1
        let timingFunction = CAMediaTimingFunction(controlPoints: 0.21, 0.53, 0.56, 0.8)

        // Scale animation
        let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale")

        scaleAnimation.keyTimes = [0, 0.7]
        scaleAnimation.timingFunction = timingFunction
        scaleAnimation.values = [0.1, 1]
        scaleAnimation.duration = duration

        // Opacity animation
        let opacityAnimation = CAKeyframeAnimation(keyPath: "opacity")

        opacityAnimation.keyTimes = [0, 0.7, 1]
        opacityAnimation.timingFunctions = [timingFunction, timingFunction]
        opacityAnimation.values = [1, 0.7, 0]
        opacityAnimation.duration = duration

        // Animation
        let animation = CAAnimationGroup()

        animation.animations = [scaleAnimation, opacityAnimation]
        animation.duration = duration
        animation.repeatCount = HUGE
        animation.isRemovedOnCompletion = false

        // Draw circle
        let circle = NVActivityIndicatorShape.ring.layerWith(size: size, color: color)
        let frame = CGRect(x: (layer.bounds.size.width - size.width) / 2,
                           y: (layer.bounds.size.height - size.height) / 2,
                           width: size.width,
                           height: size.height)

        circle.frame = frame
        circle.add(animation, forKey: "animation")
        layer.addSublayer(circle)
    }
}
#endif


================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallScaleRippleMultiple.swift
================================================
//
//  NVActivityIndicatorAnimationBallScaleRippleMultiple.swift
//  NVActivityIndicatorView
//
// The MIT License (MIT)

// Copyright (c) 2016 Vinh Nguyen

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//

#if canImport(UIKit)
import UIKit

class NVActivityIndicatorAnimationBallScaleRippleMultiple: NVActivityIndicatorAnimationDelegate {

    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
        let duration: CFTimeInterval = 1.25
        let beginTime = CACurrentMediaTime()
        let beginTimes = [0, 0.2, 0.4]
        let timingFunction = CAMediaTimingFunction(controlPoints: 0.21, 0.53, 0.56, 0.8)

        // Scale animation
        let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale")

        scaleAnimation.keyTimes = [0, 0.7]
        scaleAnimation.timingFunction = timingFunction
        scaleAnimation.values = [0, 1]
        scaleAnimation.duration = duration

        // Opacity animation
        let opacityAnimation = CAKeyframeAnimation(keyPath: "opacity")

        opacityAnimation.keyTimes = [0, 0.7, 1]
        opacityAnimation.timingFunctions = [timingFunction, timingFunction]
        opacityAnimation.values = [1, 0.7, 0]
        opacityAnimation.duration = duration

        // Animation
        let animation = CAAnimationGroup()

        animation.animations = [scaleAnimation, opacityAnimation]
        animation.duration = duration
        animation.repeatCount = HUGE
        animation.isRemovedOnCompletion = false

        // Draw circles
        for i in 0 ..< 3 {
            let circle = NVActivityIndicatorShape.ring.layerWith(size: size, color: color)
            let frame = CGRect(x: (layer.bounds.size.width - size.width) / 2,
                               y: (layer.bounds.size.height - size.height) / 2,
                               width: size.width,
                               height: size.height)

            animation.beginTime = beginTime + beginTimes[i]
            circle.frame = frame
            circle.add(animation, forKey: "animation")
            layer.addSublayer(circle)
        }
    }
}
#endif


================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallSpinFadeLoader.swift
================================================
//
//  NVActivityIndicatorAnimationBallSpinFadeLoader.swift
//  NVActivityIndicatorView
//
// The MIT License (MIT)

// Copyright (c) 2016 Vinh Nguyen

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//

#if canImport(UIKit)
import UIKit

class NVActivityIndicatorAnimationBallSpinFadeLoader: NVActivityIndicatorAnimationDelegate {

    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
        let circleSpacing: CGFloat = -2
        let circleSize = (size.width - 4 * circleSpacing) / 5
        let x = (layer.bounds.size.width - size.width) / 2
        let y = (layer.bounds.size.height - size.height) / 2
        let duration: CFTimeInterval = 1
        let beginTime = CACurrentMediaTime()
        let beginTimes: [CFTimeInterval] = [0, 0.12, 0.24, 0.36, 0.48, 0.6, 0.72, 0.84]

        // Scale animation
        let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale")

        scaleAnimation.keyTimes = [0, 0.5, 1]
        scaleAnimation.values = [1, 0.4, 1]
        scaleAnimation.duration = duration

        // Opacity animation
        let opacityAnimaton = CAKeyframeAnimation(keyPath: "opacity")

        opacityAnimaton.keyTimes = [0, 0.5, 1]
        opacityAnimaton.values = [1, 0.3, 1]
        opacityAnimaton.duration = duration

        // Animation
        let animation = CAAnimationGroup()

        animation.animations = [scaleAnimation, opacityAnimaton]
        animation.timingFunction = CAMediaTimingFunction(name: .linear)
        animation.duration = duration
        animation.repeatCount = HUGE
        animation.isRemovedOnCompletion = false

        // Draw circles
        for i in 0 ..< 8 {
            let circle = circleAt(angle: CGFloat(Double.pi / 4) * CGFloat(i),
                                  size: circleSize,
                                  origin: CGPoint(x: x, y: y),
                                  containerSize: size,
                                  color: color)

            animation.beginTime = beginTime + beginTimes[i]
            circle.add(animation, forKey: "animation")
            layer.addSublayer(circle)
        }
    }

    func circleAt(angle: CGFloat, size: CGFloat, origin: CGPoint, containerSize: CGSize, color: UIColor) -> CALayer {
        let radius = containerSize.width / 2 - size / 2
        let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: size, height: size), color: color)
        let frame = CGRect(
            x: origin.x + radius * (cos(angle) + 1),
            y: origin.y + radius * (sin(angle) + 1),
            width: size,
            height: size)

        circle.frame = frame

        return circle
    }
}
#endif


================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallTrianglePath.swift
================================================
//
//  NVActivityIndicatorAnimationBallTrianglePath.swift
//  NVActivityIndicatorView
//
// The MIT License (MIT)

// Copyright (c) 2016 Vinh Nguyen

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//

#if canImport(UIKit)
import UIKit

class NVActivityIndicatorAnimationBallTrianglePath: NVActivityIndicatorAnimationDelegate {

    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
        let circleSize = size.width / 5
        let deltaX = size.width / 2 - circleSize / 2
        let deltaY = size.height / 2 - circleSize / 2
        let x = (layer.bounds.size.width - size.width) / 2
        let y = (layer.bounds.size.height - size.height) / 2
        let duration: CFTimeInterval = 2
        let timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)

        // Animation
        let animation = CAKeyframeAnimation(keyPath: "transform")

        animation.keyTimes = [0, 0.33, 0.66, 1]
        animation.timingFunctions = [timingFunction, timingFunction, timingFunction]
        animation.duration = duration
        animation.repeatCount = HUGE
        animation.isRemovedOnCompletion = false

        // Top-center circle
        let topCenterCircle = NVActivityIndicatorShape.ring.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)

        changeAnimation(animation, values: ["{0,0}", "{hx,fy}", "{-hx,fy}", "{0,0}"], deltaX: deltaX, deltaY: deltaY)
        topCenterCircle.frame = CGRect(x: x + size.width / 2 - circleSize / 2, y: y, width: circleSize, height: circleSize)
        topCenterCircle.add(animation, forKey: "animation")
        layer.addSublayer(topCenterCircle)

        // Bottom-left circle
        let bottomLeftCircle = NVActivityIndicatorShape.ring.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)

        changeAnimation(animation, values: ["{0,0}", "{hx,-fy}", "{fx,0}", "{0,0}"], deltaX: deltaX, deltaY: deltaY)
        bottomLeftCircle.frame = CGRect(x: x, y: y + size.height - circleSize, width: circleSize, height: circleSize)
        bottomLeftCircle.add(animation, forKey: "animation")
        layer.addSublayer(bottomLeftCircle)

        // Bottom-right circle
        let bottomRightCircle = NVActivityIndicatorShape.ring.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color)

        changeAnimation(animation, values: ["{0,0}", "{-fx,0}", "{-hx,-fy}", "{0,0}"], deltaX: deltaX, deltaY: deltaY)
        bottomRightCircle.frame = CGRect(x: x + size.width - circleSize, y: y + size.height - circleSize, width: circleSize, height: circleSize)
        bottomRightCircle.add(animation, forKey: "animation")
        layer.addSublayer(bottomRightCircle)
    }

    func changeAnimation(_ animation: CAKeyframeAnimation, values rawValues: [String], deltaX: CGFloat, deltaY: CGFloat) {
        let values = NSMutableArray(capacity: 5)

        for rawValue in rawValues {
            let point = NSCoder.cgPoint(for: translateString(rawValue, deltaX: deltaX, deltaY: deltaY))

            values.add(NSValue(caTransform3D: CATransform3DMakeTranslation(point.x, point.y, 0)))
        }
        animation.values = values as [AnyObject]
    }

    func translateString(_ valueString: String, deltaX: CGFloat, deltaY: CGFloat) -> String {
        let valueMutableString = NSMutableString(string: valueString)
        let fullDeltaX = 2 * deltaX
        let fullDeltaY = 2 * deltaY
        var range = NSRange(location: 0, length: valueMutableString.length)

        valueMutableString.replaceOccurrences(of: "hx", with: "\(deltaX)", options: NSString.CompareOptions.caseInsensitive, range: range)
        range.length = valueMutableString.length
        valueMutableString.replaceOccurrences(of: "fx", with: "\(fullDeltaX)", options: NSString.CompareOptions.caseInsensitive, range: range)
        range.length = valueMutableString.length
        valueMutableString.replaceOccurrences(of: "hy", with: "\(deltaY)", options: NSString.CompareOptions.caseInsensitive, range: range)
        range.length = valueMutableString.length
        valueMutableString.replaceOccurrences(of: "fy", with: "\(fullDeltaY)", options: NSString.CompareOptions.caseInsensitive, range: range)

        return valueMutableString as String
    }
}
#endif


================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallZigZag.swift
================================================
//
//  NVActivityIndicatorAnimationBallZigZag.swift
//  NVActivityIndicatorView
//
// The MIT License (MIT)

// Copyright (c) 2016 Vinh Nguyen

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//

#if canImport(UIKit)
import UIKit
import QuartzCore

class NVActivityIndicatorAnimationBallZigZag: NVActivityIndicatorAnimationDelegate {

    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
        let circleSize: CGFloat = size.width / 5
        let duration: CFTimeInterval = 0.7
        let deltaX = size.width / 2 - circleSize / 2
        let deltaY = size.height / 2 - circleSize / 2
        let frame = CGRect(x: (layer.bounds.size.width - circleSize) / 2, y: (layer.bounds.size.height - circleSize) / 2, width: circleSize, height: circleSize)

        // Circle 1 animation
        let animation = CAKeyframeAnimation(keyPath: "transform")

        animation.keyTimes = [0, 0.33, 0.66, 1]
        animation.timingFunction = CAMediaTimingFunction(name: .linear)
        animation.values = [
            NSValue(caTransform3D: CATransform3DMakeTranslation(0, 0, 0)),
            NSValue(caTransform3D: CATransform3DMakeTranslation(-deltaX, -deltaY, 0)),
            NSValue(caTransform3D: CATransform3DMakeTranslation(deltaX, -deltaY, 0)),
            NSValue(caTransform3D: CATransform3DMakeTranslation(0, 0, 0))
        ]
        animation.duration = duration
        animation.repeatCount = HUGE
        animation.isRemovedOnCompletion = false

        // Draw circle 1
        circleAt(frame: frame, layer: layer, size: CGSize(width: circleSize, height: circleSize), color: color, animation: animation)

        // Circle 2 animation
        animation.values = [
            NSValue(caTransform3D: CATransform3DMakeTranslation(0, 0, 0)),
            NSValue(caTransform3D: CATransform3DMakeTranslation(deltaX, deltaY, 0)),
            NSValue(caTransform3D: CATransform3DMakeTranslation(-deltaX, deltaY, 0)),
            NSValue(caTransform3D: CATransform3DMakeTranslation(0, 0, 0))
        ]

        // Draw circle 2
        circleAt(frame: frame, layer: layer, size: CGSize(width: circleSize, height: circleSize), color: color, animation: animation)
    }

    func circleAt(frame: CGRect, layer: CALayer, size: CGSize, color: UIColor, animation: CAAnimation) {
        let circle = NVActivityIndicatorShape.circle.layerWith(size: size, color: color)

        circle.frame = frame
        circle.add(animation, forKey: "animation")
        layer.addSublayer(circle)
    }
}
#endif


================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBallZigZagDeflect.swift
================================================
//
//  NVActivityIndicatorAnimationBallZigZagDeflect.swift
//  NVActivityIndicatorView
//
// The MIT License (MIT)

// Copyright (c) 2016 Vinh Nguyen

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//

#if canImport(UIKit)
import UIKit

class NVActivityIndicatorAnimationBallZigZagDeflect: NVActivityIndicatorAnimationDelegate {

    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
        let circleSize: CGFloat = size.width / 5
        let duration: CFTimeInterval = 0.75
        let deltaX = size.width / 2 - circleSize / 2
        let deltaY = size.height / 2 - circleSize / 2
        let frame = CGRect(x: (layer.bounds.size.width - circleSize) / 2, y: (layer.bounds.size.height - circleSize) / 2, width: circleSize, height: circleSize)

        // Circle 1 animation
        let animation = CAKeyframeAnimation(keyPath: "transform")

        animation.keyTimes = [0, 0.33, 0.66, 1]
        animation.timingFunction = CAMediaTimingFunction(name: .linear)
        animation.values = [
            NSValue(caTransform3D: CATransform3DMakeTranslation(0, 0, 0)),
            NSValue(caTransform3D: CATransform3DMakeTranslation(-deltaX, -deltaY, 0)),
            NSValue(caTransform3D: CATransform3DMakeTranslation(deltaX, -deltaY, 0)),
            NSValue(caTransform3D: CATransform3DMakeTranslation(0, 0, 0))
        ]
        animation.duration = duration
        animation.repeatCount = HUGE
        animation.autoreverses = true
        animation.isRemovedOnCompletion = false

        // Draw circle 1
        circleAt(frame: frame, layer: layer, size: CGSize(width: circleSize, height: circleSize), color: color, animation: animation)

        // Circle 2 animation
        animation.values = [
            NSValue(caTransform3D: CATransform3DMakeTranslation(0, 0, 0)),
            NSValue(caTransform3D: CATransform3DMakeTranslation(deltaX, deltaY, 0)),
            NSValue(caTransform3D: CATransform3DMakeTranslation(-deltaX, deltaY, 0)),
            NSValue(caTransform3D: CATransform3DMakeTranslation(0, 0, 0))
        ]

        // Draw circle 2
        circleAt(frame: frame, layer: layer, size: CGSize(width: circleSize, height: circleSize), color: color, animation: animation)
    }

    func circleAt(frame: CGRect, layer: CALayer, size: CGSize, color: UIColor, animation: CAAnimation) {
        let circle = NVActivityIndicatorShape.circle.layerWith(size: size, color: color)

        circle.frame = frame
        circle.add(animation, forKey: "animation")
        layer.addSublayer(circle)
    }
}
#endif


================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationBlank.swift
================================================
//
//  NVActivityIndicatorAnimationBlank.swift
//  NVActivityIndicatorView
//
// The MIT License (MIT)

// Copyright (c) 2016 Vinh Nguyen

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//

#if canImport(UIKit)
import UIKit

class NVActivityIndicatorAnimationBlank: NVActivityIndicatorAnimationDelegate {

    func setUpAnimation(in _: CALayer, size _: CGSize, color _: UIColor) {
        // Do nothing
    }
}
#endif


================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationCircleStrokeSpin.swift
================================================
//
//  NVActivityIndicatorAnimationCircleStrokeSpin.swift
//  NVActivityIndicatorView
//
// The MIT License (MIT)

// Copyright (c) 2016 Vinh Nguyen

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//

#if canImport(UIKit)
import UIKit

class NVActivityIndicatorAnimationCircleStrokeSpin: NVActivityIndicatorAnimationDelegate {

    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
        let beginTime: Double = 0.5
        let strokeStartDuration: Double = 1.2
        let strokeEndDuration: Double = 0.7

        let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation")
        rotationAnimation.byValue = Float.pi * 2
        rotationAnimation.timingFunction = CAMediaTimingFunction(name: .linear)

        let strokeEndAnimation = CABasicAnimation(keyPath: "strokeEnd")
        strokeEndAnimation.duration = strokeEndDuration
        strokeEndAnimation.timingFunction = CAMediaTimingFunction(controlPoints: 0.4, 0.0, 0.2, 1.0)
        strokeEndAnimation.fromValue = 0
        strokeEndAnimation.toValue = 1

        let strokeStartAnimation = CABasicAnimation(keyPath: "strokeStart")
        strokeStartAnimation.duration = strokeStartDuration
        strokeStartAnimation.timingFunction = CAMediaTimingFunction(controlPoints: 0.4, 0.0, 0.2, 1.0)
        strokeStartAnimation.fromValue = 0
        strokeStartAnimation.toValue = 1
        strokeStartAnimation.beginTime = beginTime

        let groupAnimation = CAAnimationGroup()
        groupAnimation.animations = [rotationAnimation, strokeEndAnimation, strokeStartAnimation]
        groupAnimation.duration = strokeStartDuration + beginTime
        groupAnimation.repeatCount = .infinity
        groupAnimation.isRemovedOnCompletion = false
        groupAnimation.fillMode = .forwards

        let circle = NVActivityIndicatorShape.stroke.layerWith(size: size, color: color)
        let frame = CGRect(
            x: (layer.bounds.width - size.width) / 2,
            y: (layer.bounds.height - size.height) / 2,
            width: size.width,
            height: size.height
        )

        circle.frame = frame
        circle.add(groupAnimation, forKey: "animation")
        layer.addSublayer(circle)
    }
}
#endif


================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationCubeTransition.swift
================================================
//
//  NVActivityIndicatorAnimationCubeTransition.swift
//  NVActivityIndicatorView
//
// The MIT License (MIT)

// Copyright (c) 2016 Vinh Nguyen

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//

#if canImport(UIKit)
import UIKit

class NVActivityIndicatorAnimationCubeTransition: NVActivityIndicatorAnimationDelegate {

    func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) {
        let squareSize = size.width / 5
        let x = (layer.bounds.size.width - size.width) / 2
        let y = (layer.bounds.size.height - size.height) / 2
        let deltaX = size.width - squareSize
        let deltaY = size.height - squareSize
        let duration: CFTimeInterval = 1.6
        let beginTime = CACurrentMediaTime()
        let beginTimes: [CFTimeInterval] = [0, -0.8]
        let timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)

        // Scale animation
        let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale")

        scaleAnimation.keyTimes = [0, 0.25, 0.5, 0.75, 1]
        scaleAnimation.timingFunctions = [timingFunction, timingFunction, timingFunction, timingFunction]
        scaleAnimation.values = [1, 0.5, 1, 0.5, 1]
        scaleAnimation.duration = duration

        // Translate animation
        let translateAnimation = CAKeyframeAnimation(keyPath: "transform.translation")

        translateAnimation.keyTimes = scaleAnimation.keyTimes
        translateAnimation.timingFunctions = scaleAnimation.timingFunctions
        translateAnimation.values = [
            NSValue(cgSize: CGSize(width: 0, height: 0)),
            NSValue(cgSize: CGSize(width: deltaX, height: 0)),
            NSValue(cgSize: CGSize(width: deltaX, height: deltaY)),
            NSValue(cgSize: CGSize(width: 0, height: deltaY)),
            NSValue(cgSize: CGSize(width: 0, height: 0))
        ]
        translateAnimation.duration = duration

        // Rotate animation
        let rotateAnimation = CAKeyframeAnimation(keyPath: "transform.rotation.z")

        rotateAnimation.keyTimes = scaleAnimation.keyTimes
        rotateAnimation.timingFunctions = scaleAnimation.timingFunctions
        rotateAnimation.values = [0, -Double.pi / 2, -Double.pi, -1.5 * Double.pi, -2 * Double.pi]
        rotateAnimation.duration = duration

        // Animation
        let animation = CAAnimationGroup()

        animation.animations = [scaleAnimation, translateAnimation, rotateAnimation]
        animation.duration = duration
        animation.repeatCount = HUGE
        animation.isRemovedOnCompletion = false

        // Draw squares
        for i in 0 ..< 2 {
            let square = NVActivityIndicatorShape.rectangle.layerWith(size: CGSize(width: squareSize, height: squareSize), color: color)
            let frame = CGRect(x: x, y: y, width: squareSize, height: squareSize)

            animation.beginTime = beginTime + beginTimes[i]
            square.frame = frame
            square.add(animation, forKey: "animation")
            layer.addSublayer(square)
        }
    }
}
#endif


================================================
FILE: Sources/Base/Animations/NVActivityIndicatorAnimationLineScale.swift
================================================
//
//  NVActivityIndicatorAnimationBarScale.swift
//  NVActivityIndicatorView
//
// The MIT License (MIT)

// Copyright (c) 2016 Vinh Nguyen

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice sha
Download .txt
gitextract_aoakydhx/

├── .github/
│   └── workflows/
│       └── ios.yml
├── .gitignore
├── .jazzy.yaml
├── .swiftlint.yml
├── CHANGELOG.md
├── Example/
│   ├── AppDelegate.swift
│   ├── Assets.xcassets/
│   │   ├── AppIcon.appiconset/
│   │   │   └── Contents.json
│   │   └── Contents.json
│   ├── Base.lproj/
│   │   ├── LaunchScreen.storyboard
│   │   └── Main.storyboard
│   ├── Info.plist
│   ├── SceneDelegate.swift
│   └── ViewController.swift
├── LICENSE
├── NVActivityIndicatorView.podspec
├── NVActivityIndicatorView.xcodeproj/
│   ├── NVActivityIndicatorViewExtended_Info.plist
│   ├── NVActivityIndicatorView_Info.plist
│   ├── project.pbxproj
│   ├── project.xcworkspace/
│   │   ├── contents.xcworkspacedata
│   │   └── xcshareddata/
│   │       ├── IDEWorkspaceChecks.plist
│   │       ├── WorkspaceSettings.xcsettings
│   │       └── swiftpm/
│   │           └── Package.resolved
│   └── xcshareddata/
│       └── xcschemes/
│           ├── Example.xcscheme
│           └── NVActivityIndicatorView-Package.xcscheme
├── Package.swift
├── PrivacyInfo.xcprivacy
├── README.md
├── Sources/
│   ├── Base/
│   │   ├── Animations/
│   │   │   ├── NVActivityIndicatorAnimationAudioEqualizer.swift
│   │   │   ├── NVActivityIndicatorAnimationBallBeat.swift
│   │   │   ├── NVActivityIndicatorAnimationBallClipRotate.swift
│   │   │   ├── NVActivityIndicatorAnimationBallClipRotateMultiple.swift
│   │   │   ├── NVActivityIndicatorAnimationBallClipRotatePulse.swift
│   │   │   ├── NVActivityIndicatorAnimationBallDoubleBounce.swift
│   │   │   ├── NVActivityIndicatorAnimationBallGridBeat.swift
│   │   │   ├── NVActivityIndicatorAnimationBallGridPulse.swift
│   │   │   ├── NVActivityIndicatorAnimationBallPulse.swift
│   │   │   ├── NVActivityIndicatorAnimationBallPulseRise.swift
│   │   │   ├── NVActivityIndicatorAnimationBallPulseSync.swift
│   │   │   ├── NVActivityIndicatorAnimationBallRotate.swift
│   │   │   ├── NVActivityIndicatorAnimationBallRotateChase.swift
│   │   │   ├── NVActivityIndicatorAnimationBallScale.swift
│   │   │   ├── NVActivityIndicatorAnimationBallScaleMultiple.swift
│   │   │   ├── NVActivityIndicatorAnimationBallScaleRipple.swift
│   │   │   ├── NVActivityIndicatorAnimationBallScaleRippleMultiple.swift
│   │   │   ├── NVActivityIndicatorAnimationBallSpinFadeLoader.swift
│   │   │   ├── NVActivityIndicatorAnimationBallTrianglePath.swift
│   │   │   ├── NVActivityIndicatorAnimationBallZigZag.swift
│   │   │   ├── NVActivityIndicatorAnimationBallZigZagDeflect.swift
│   │   │   ├── NVActivityIndicatorAnimationBlank.swift
│   │   │   ├── NVActivityIndicatorAnimationCircleStrokeSpin.swift
│   │   │   ├── NVActivityIndicatorAnimationCubeTransition.swift
│   │   │   ├── NVActivityIndicatorAnimationLineScale.swift
│   │   │   ├── NVActivityIndicatorAnimationLineScaleParty.swift
│   │   │   ├── NVActivityIndicatorAnimationLineScalePulseOut.swift
│   │   │   ├── NVActivityIndicatorAnimationLineScalePulseOutRapid.swift
│   │   │   ├── NVActivityIndicatorAnimationLineSpinFadeLoader.swift
│   │   │   ├── NVActivityIndicatorAnimationOrbit.swift
│   │   │   ├── NVActivityIndicatorAnimationPacman.swift
│   │   │   ├── NVActivityIndicatorAnimationSemiCircleSpin.swift
│   │   │   ├── NVActivityIndicatorAnimationSquareSpin.swift
│   │   │   └── NVActivityIndicatorAnimationTriangleSkewSpin.swift
│   │   ├── NVActivityIndicatorAnimationDelegate.swift
│   │   ├── NVActivityIndicatorShape.swift
│   │   └── NVActivityIndicatorView.swift
│   └── Extended/
│       ├── NVActivityIndicatorPresenter.swift
│       └── NVActivityIndicatorViewable.swift
├── Tests/
│   ├── ActivityDataTests.swift
│   ├── Info.plist
│   ├── NVActivityIndicatorPresenterTests.swift
│   ├── NVActivityIndicatorTypeTests.swift
│   ├── NVActivityIndicatorViewTests.swift
│   └── Tests-Bridging-Header.h
├── docs/
│   ├── CNAME
│   ├── Classes/
│   │   └── NVActivityIndicatorView.html
│   ├── Classes.html
│   ├── Enums/
│   │   └── NVActivityIndicatorType.html
│   ├── Enums.html
│   ├── Typealiases.html
│   ├── css/
│   │   ├── highlight.css
│   │   └── jazzy.css
│   ├── docsets/
│   │   ├── NVActivityIndicatorView.docset/
│   │   │   └── Contents/
│   │   │       ├── Info.plist
│   │   │       └── Resources/
│   │   │           ├── Documents/
│   │   │           │   ├── Classes/
│   │   │           │   │   └── NVActivityIndicatorView.html
│   │   │           │   ├── Classes.html
│   │   │           │   ├── Enums/
│   │   │           │   │   └── NVActivityIndicatorType.html
│   │   │           │   ├── Enums.html
│   │   │           │   ├── Typealiases.html
│   │   │           │   ├── css/
│   │   │           │   │   ├── highlight.css
│   │   │           │   │   └── jazzy.css
│   │   │           │   ├── index.html
│   │   │           │   └── js/
│   │   │           │       ├── jazzy.js
│   │   │           │       ├── jazzy.search.js
│   │   │           │       └── typeahead.jquery.js
│   │   │           └── docSet.dsidx
│   │   └── NVActivityIndicatorView.tgz
│   ├── index.html
│   ├── js/
│   │   ├── jazzy.js
│   │   ├── jazzy.search.js
│   │   └── typeahead.jquery.js
│   └── undocumented.json
└── scripts/
    └── bump-version.sh
Download .txt
SYMBOL INDEX (100 symbols across 6 files)

FILE: docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/js/jazzy.js
  function toggleItem (line 15) | function toggleItem($link, $content) {
  function itemLinkToContent (line 21) | function itemLinkToContent($link) {
  function openCurrentItemIfClosed (line 26) | function openCurrentItemIfClosed() {

FILE: docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/js/jazzy.search.js
  function displayTemplate (line 10) | function displayTemplate(result) {
  function suggestionTemplate (line 14) | function suggestionTemplate(result) {

FILE: docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/js/typeahead.jquery.js
  function reverseArgs (line 55) | function reverseArgs(index, value) {
  function template (line 100) | function template() {
  function _p8 (line 153) | function _p8(s) {
  function build (line 178) | function build(o) {
  function buildHtml (line 197) | function buildHtml(c) {
  function buildSelectors (line 203) | function buildSelectors(classes) {
  function buildCss (line 210) | function buildCss() {
  function EventBus (line 267) | function EventBus(o) {
  function on (line 304) | function on(method, types, cb, context) {
  function onAsync (line 321) | function onAsync(types, cb, context) {
  function onSync (line 324) | function onSync(types, cb, context) {
  function off (line 327) | function off(types) {
  function trigger (line 338) | function trigger(types) {
  function getFlush (line 352) | function getFlush(callbacks, context, args) {
  function getNextTick (line 362) | function getNextTick() {
  function bindContext (line 379) | function bindContext(fn, context) {
  function hightlightTextNode (line 433) | function hightlightTextNode(textNode) {
  function traverse (line 445) | function traverse(el, hightlightTextNode) {
  function accent_replacer (line 457) | function accent_replacer(chr) {
  function getRegex (line 460) | function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensiti...
  function Input (line 485) | function Input(o, www) {
  function buildOverflowHelper (line 685) | function buildOverflowHelper($input) {
  function areQueriesEquivalent (line 702) | function areQueriesEquivalent(a, b) {
  function withModifier (line 705) | function withModifier($e) {
  function Dataset (line 718) | function Dataset(o, www) {
  function sync (line 859) | function sync(suggestions) {
  function async (line 871) | function async(suggestions) {
  function getDisplayFn (line 896) | function getDisplayFn(display) {
  function getTemplates (line 903) | function getTemplates(templates, displayFn) {
  function isValidName (line 919) | function isValidName(str) {
  function Menu (line 925) | function Menu(o, www) {
  function updateDataset (line 1047) | function updateDataset(dataset) {
  function clearDataset (line 1055) | function clearDataset(dataset) {
  function destroyDataset (line 1063) | function destroyDataset(dataset) {
  function Status (line 1072) | function Status(options) {
  function DefaultMenu (line 1122) | function DefaultMenu() {
  function Typeahead (line 1165) | function Typeahead(o, www) {
  function c (line 1448) | function c(ctx) {
  function attach (line 1474) | function attach() {
  function ttEach (line 1633) | function ttEach($els, fn) {
  function buildHintFromInput (line 1639) | function buildHintFromInput($input, www) {
  function prepInput (line 1648) | function prepInput($input, www) {
  function getBackgroundStyles (line 1663) | function getBackgroundStyles($el) {
  function revert (line 1675) | function revert($input) {
  function $elOrNull (line 1688) | function $elOrNull(obj) {

FILE: docs/js/jazzy.js
  function toggleItem (line 15) | function toggleItem($link, $content) {
  function itemLinkToContent (line 21) | function itemLinkToContent($link) {
  function openCurrentItemIfClosed (line 26) | function openCurrentItemIfClosed() {

FILE: docs/js/jazzy.search.js
  function displayTemplate (line 10) | function displayTemplate(result) {
  function suggestionTemplate (line 14) | function suggestionTemplate(result) {

FILE: docs/js/typeahead.jquery.js
  function reverseArgs (line 55) | function reverseArgs(index, value) {
  function template (line 100) | function template() {
  function _p8 (line 153) | function _p8(s) {
  function build (line 178) | function build(o) {
  function buildHtml (line 197) | function buildHtml(c) {
  function buildSelectors (line 203) | function buildSelectors(classes) {
  function buildCss (line 210) | function buildCss() {
  function EventBus (line 267) | function EventBus(o) {
  function on (line 304) | function on(method, types, cb, context) {
  function onAsync (line 321) | function onAsync(types, cb, context) {
  function onSync (line 324) | function onSync(types, cb, context) {
  function off (line 327) | function off(types) {
  function trigger (line 338) | function trigger(types) {
  function getFlush (line 352) | function getFlush(callbacks, context, args) {
  function getNextTick (line 362) | function getNextTick() {
  function bindContext (line 379) | function bindContext(fn, context) {
  function hightlightTextNode (line 433) | function hightlightTextNode(textNode) {
  function traverse (line 445) | function traverse(el, hightlightTextNode) {
  function accent_replacer (line 457) | function accent_replacer(chr) {
  function getRegex (line 460) | function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensiti...
  function Input (line 485) | function Input(o, www) {
  function buildOverflowHelper (line 685) | function buildOverflowHelper($input) {
  function areQueriesEquivalent (line 702) | function areQueriesEquivalent(a, b) {
  function withModifier (line 705) | function withModifier($e) {
  function Dataset (line 718) | function Dataset(o, www) {
  function sync (line 859) | function sync(suggestions) {
  function async (line 871) | function async(suggestions) {
  function getDisplayFn (line 896) | function getDisplayFn(display) {
  function getTemplates (line 903) | function getTemplates(templates, displayFn) {
  function isValidName (line 919) | function isValidName(str) {
  function Menu (line 925) | function Menu(o, www) {
  function updateDataset (line 1047) | function updateDataset(dataset) {
  function clearDataset (line 1055) | function clearDataset(dataset) {
  function destroyDataset (line 1063) | function destroyDataset(dataset) {
  function Status (line 1072) | function Status(options) {
  function DefaultMenu (line 1122) | function DefaultMenu() {
  function Typeahead (line 1165) | function Typeahead(o, www) {
  function c (line 1448) | function c(ctx) {
  function attach (line 1474) | function attach() {
  function ttEach (line 1633) | function ttEach($els, fn) {
  function buildHintFromInput (line 1639) | function buildHintFromInput($input, www) {
  function prepInput (line 1648) | function prepInput($input, www) {
  function getBackgroundStyles (line 1663) | function getBackgroundStyles($el) {
  function revert (line 1675) | function revert($input) {
  function $elOrNull (line 1688) | function $elOrNull(obj) {
Condensed preview — 100 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (667K chars).
[
  {
    "path": ".github/workflows/ios.yml",
    "chars": 2475,
    "preview": "name: iOS starter workflow\n\non:\n  push:\n    branches: [ \"master\" ]\n  pull_request:\n    branches: [ \"master\" ]\n\njobs:\n  b"
  },
  {
    "path": ".gitignore",
    "chars": 2570,
    "preview": "# General\n.DS_Store\n.AppleDouble\n.LSOverride\n\n# Icon must end with two \\r\nIcon\n\n# Thumbnails\n._*\n\n# Files that might app"
  },
  {
    "path": ".jazzy.yaml",
    "chars": 397,
    "preview": "readme: README.md\nauthor: Vinh Nguyen\nauthor_url: https://github.com/ninjaprox\ngithub_url: https://github.com/ninjaprox/"
  },
  {
    "path": ".swiftlint.yml",
    "chars": 148,
    "preview": "disabled_rules:\n- line_length\n\ntype_name:\n  max_length: 60\nidentifier_name:\n  excluded:\n  - x\n  - y\n  - i\n  - j\nfunction"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 7310,
    "preview": "# Change log\n\n## [5.2.0](https://github.com/ninjaprox/NVActivityIndicatorView/releases/tag/5.2.0)\n\n-   Add privacy manif"
  },
  {
    "path": "Example/AppDelegate.swift",
    "chars": 2444,
    "preview": "//\n//  AppDelegate.swift\n//  Example\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2020 Vinh Nguyen\n\n// Permission is he"
  },
  {
    "path": "Example/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "chars": 1590,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\""
  },
  {
    "path": "Example/Assets.xcassets/Contents.json",
    "chars": 62,
    "preview": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/Base.lproj/LaunchScreen.storyboard",
    "chars": 1665,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
  },
  {
    "path": "Example/Base.lproj/Main.storyboard",
    "chars": 1604,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
  },
  {
    "path": "Example/Info.plist",
    "chars": 2008,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "Example/SceneDelegate.swift",
    "chars": 3375,
    "preview": "//\n//  SceneDelegate.swift\n//  Example\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2020 Vinh Nguyen\n\n// Permission is "
  },
  {
    "path": "Example/ViewController.swift",
    "chars": 4444,
    "preview": "//\n//  ViewController.swift\n//  Example\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2020 Vinh Nguyen\n\n// Permission is"
  },
  {
    "path": "LICENSE",
    "chars": 1078,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2016 Vinh Nguyen\n\nPermission is hereby granted, free of charge, to any person obtai"
  },
  {
    "path": "NVActivityIndicatorView.podspec",
    "chars": 1120,
    "preview": "Pod::Spec.new do |s|\n  s.name              = 'NVActivityIndicatorView'\n  s.version           = '5.2.0'\n  s.summary      "
  },
  {
    "path": "NVActivityIndicatorView.xcodeproj/NVActivityIndicatorViewExtended_Info.plist",
    "chars": 784,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "NVActivityIndicatorView.xcodeproj/NVActivityIndicatorView_Info.plist",
    "chars": 784,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "NVActivityIndicatorView.xcodeproj/project.pbxproj",
    "chars": 62849,
    "preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
  },
  {
    "path": "NVActivityIndicatorView.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "chars": 134,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef"
  },
  {
    "path": "NVActivityIndicatorView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "chars": 238,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "NVActivityIndicatorView.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "chars": 269,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "NVActivityIndicatorView.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved",
    "chars": 402,
    "preview": "{\n  \"originHash\" : \"1fa961aa1dc717cea452f3389668f0f99a254f07e4eb11d190768a53798f744f\",\n  \"pins\" : [\n    {\n      \"identit"
  },
  {
    "path": "NVActivityIndicatorView.xcodeproj/xcshareddata/xcschemes/Example.xcscheme",
    "chars": 3320,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"2630\"\n   version = \"1.3\">\n   <BuildAction\n      "
  },
  {
    "path": "NVActivityIndicatorView.xcodeproj/xcshareddata/xcschemes/NVActivityIndicatorView-Package.xcscheme",
    "chars": 2766,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"2630\"\n   version = \"1.3\">\n   <BuildAction\n      "
  },
  {
    "path": "Package.swift",
    "chars": 743,
    "preview": "// swift-tools-version:5.0\n// The swift-tools-version declares the minimum version of Swift required to build this packa"
  },
  {
    "path": "PrivacyInfo.xcprivacy",
    "chars": 228,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "README.md",
    "chars": 4804,
    "preview": "# NVActivityIndicatorView\n\n[![Build Status](https://github.com/ninjaprox/NVActivityIndicatorView/actions/workflows/ios.y"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationAudioEqualizer.swift",
    "chars": 2963,
    "preview": "//\n//  NVActivityIndicatorAnimationAudioEqualizer.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copy"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallBeat.swift",
    "chars": 3193,
    "preview": "//\n//  NVActivityIndicatorAnimationBallBeat.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright "
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallClipRotate.swift",
    "chars": 2751,
    "preview": "//\n//  NVActivityIndicatorBallClipRotate.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c)"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallClipRotateMultiple.swift",
    "chars": 4157,
    "preview": "//\n//  NVActivityIndicatorAnimationBallClipRotateMultiple.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallClipRotatePulse.swift",
    "chars": 4415,
    "preview": "//\n//  NVActivityIndicatorAnimationBallClipRotatePulse.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n//"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallDoubleBounce.swift",
    "chars": 2646,
    "preview": "//\n//  NVActivityIndicatorAnimationBallsBounce.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyrig"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallGridBeat.swift",
    "chars": 3059,
    "preview": "//\n//  NVActivityIndicatorAnimationBallGridBeat.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyri"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallGridPulse.swift",
    "chars": 3538,
    "preview": "//\n//  NVActivityIndicatorAnimationBallGridPulse.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyr"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallPulse.swift",
    "chars": 2890,
    "preview": "//\n//  NVActivityIndicatorAnimationBallPulse.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallPulseRise.swift",
    "chars": 4905,
    "preview": "//\n//  NVActivityIndicatorAnimationBallPulseRise.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyr"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallPulseSync.swift",
    "chars": 2959,
    "preview": "//\n//  NVActivityIndicatorAnimationBallPulseSync.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyr"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallRotate.swift",
    "chars": 3839,
    "preview": "//\n//  NVActivityIndicatorAnimationBallRotate.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyrigh"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallRotateChase.swift",
    "chars": 3411,
    "preview": "//\n//  NVActivityIndicatorAnimationBallRotateChase.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Cop"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallScale.swift",
    "chars": 2693,
    "preview": "//\n//  NVActivityIndicatorAnimationBallScale.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallScaleMultiple.swift",
    "chars": 2982,
    "preview": "//\n//  NVActivityIndicatorAnimationBallScaleMultiple.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// C"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallScaleRipple.swift",
    "chars": 2897,
    "preview": "//\n//  NVActivityIndicatorAnimationBallScaleRipple.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Cop"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallScaleRippleMultiple.swift",
    "chars": 3128,
    "preview": "//\n//  NVActivityIndicatorAnimationBallScaleRippleMultiple.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallSpinFadeLoader.swift",
    "chars": 3690,
    "preview": "//\n//  NVActivityIndicatorAnimationBallSpinFadeLoader.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// "
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallTrianglePath.swift",
    "chars": 5285,
    "preview": "//\n//  NVActivityIndicatorAnimationBallTrianglePath.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Co"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallZigZag.swift",
    "chars": 3533,
    "preview": "//\n//  NVActivityIndicatorAnimationBallZigZag.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyrigh"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBallZigZagDeflect.swift",
    "chars": 3568,
    "preview": "//\n//  NVActivityIndicatorAnimationBallZigZagDeflect.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// C"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationBlank.swift",
    "chars": 1439,
    "preview": "//\n//  NVActivityIndicatorAnimationBlank.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c)"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationCircleStrokeSpin.swift",
    "chars": 3238,
    "preview": "//\n//  NVActivityIndicatorAnimationCircleStrokeSpin.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Co"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationCubeTransition.swift",
    "chars": 4059,
    "preview": "//\n//  NVActivityIndicatorAnimationCubeTransition.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copy"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationLineScale.swift",
    "chars": 2656,
    "preview": "//\n//  NVActivityIndicatorAnimationBarScale.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright "
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationLineScaleParty.swift",
    "chars": 2672,
    "preview": "//\n//  NVActivityIndicatorAnimationLineScaleParty.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copy"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationLineScalePulseOut.swift",
    "chars": 2765,
    "preview": "//\n//  NVActivityIndicatorAnimationLineScalePulseOut.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// C"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationLineScalePulseOutRapid.swift",
    "chars": 2821,
    "preview": "//\n//  NVActivityIndicatorAnimationLineScalePulseOutRapid.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationLineSpinFadeLoader.swift",
    "chars": 3964,
    "preview": "//\n//  NVActivityIndicatorAnimationLineSpinFadeLoader.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// "
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationOrbit.swift",
    "chars": 7559,
    "preview": "//\n//  NVActivityIndicatorAnimationOrbit.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c)"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationPacman.swift",
    "chars": 4741,
    "preview": "//\n//  NVActivityIndicatorAnimationPacman.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationSemiCircleSpin.swift",
    "chars": 2242,
    "preview": "//\n//  NVActivityIndicatorAnimationSemiCircleSpin.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copy"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationSquareSpin.swift",
    "chars": 3547,
    "preview": "//\n//  NVActivityIndicatorAnimationSquareSpin.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyrigh"
  },
  {
    "path": "Sources/Base/Animations/NVActivityIndicatorAnimationTriangleSkewSpin.swift",
    "chars": 3497,
    "preview": "//\n//  NVActivityIndicatorAnimationTriangleSkewSpin.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Co"
  },
  {
    "path": "Sources/Base/NVActivityIndicatorAnimationDelegate.swift",
    "chars": 1420,
    "preview": "//\n//  NVActivityIndicatorDelegate.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 "
  },
  {
    "path": "Sources/Base/NVActivityIndicatorShape.swift",
    "chars": 7235,
    "preview": "//\n//  NVActivityIndicatorShape.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vin"
  },
  {
    "path": "Sources/Base/NVActivityIndicatorView.swift",
    "chars": 18847,
    "preview": "//\n//  NVActivityIndicatorView.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh"
  },
  {
    "path": "Sources/Extended/NVActivityIndicatorPresenter.swift",
    "chars": 14928,
    "preview": "//\n//  NVActivityIndicatorPresenter.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016"
  },
  {
    "path": "Sources/Extended/NVActivityIndicatorViewable.swift",
    "chars": 4176,
    "preview": "//\n//  NVActivityIndicatorViewable.swift\n//  NVActivityIndicatorView\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 "
  },
  {
    "path": "Tests/ActivityDataTests.swift",
    "chars": 4121,
    "preview": "//\n//  ActivityDataTests.swift\n//  NVActivityIndicatorViewDemo\n//\n// The MIT License (MIT)\n\n// Copyright (c) 2016 Vinh N"
  },
  {
    "path": "Tests/Info.plist",
    "chars": 730,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "Tests/NVActivityIndicatorPresenterTests.swift",
    "chars": 7860,
    "preview": "//\n//  NVActivityIndicatorPresenterTests.swift\n//  NVActivityIndicatorViewDemo\n//\n// The MIT License (MIT)\n\n// Copyright"
  },
  {
    "path": "Tests/NVActivityIndicatorTypeTests.swift",
    "chars": 4450,
    "preview": "//\n//  NVActivityIndicatorTypeTests.swift\n//  NVActivityIndicatorViewDemo\n//\n// The MIT License (MIT)\n\n// Copyright (c) "
  },
  {
    "path": "Tests/NVActivityIndicatorViewTests.swift",
    "chars": 5161,
    "preview": "//\n//  NVActivityIndicatorViewTests.swift\n//  NVActivityIndicatorViewTests\n//\n// The MIT License (MIT)\n\n// Copyright (c)"
  },
  {
    "path": "Tests/Tests-Bridging-Header.h",
    "chars": 104,
    "preview": "//\n//  Use this file to import your target's public headers that you would like to expose to Swift.\n//\n\n"
  },
  {
    "path": "docs/CNAME",
    "chars": 33,
    "preview": "nvactivityindicatorview.vinhis.me"
  },
  {
    "path": "docs/Classes/NVActivityIndicatorView.html",
    "chars": 22956,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>NVActivityIndicatorView Class Reference</title>\n    <link rel=\"styl"
  },
  {
    "path": "docs/Classes.html",
    "chars": 4471,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Classes  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/cs"
  },
  {
    "path": "docs/Enums/NVActivityIndicatorType.html",
    "chars": 31007,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>NVActivityIndicatorType Enumeration Reference</title>\n    <link rel"
  },
  {
    "path": "docs/Enums.html",
    "chars": 6556,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Enumerations  Reference</title>\n    <link rel=\"stylesheet\" type=\"te"
  },
  {
    "path": "docs/Typealiases.html",
    "chars": 5284,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Type Aliases  Reference</title>\n    <link rel=\"stylesheet\" type=\"te"
  },
  {
    "path": "docs/css/highlight.css",
    "chars": 2864,
    "preview": "/*! Jazzy - https://github.com/realm/jazzy\n *  Copyright Realm Inc.\n *  SPDX-License-Identifier: MIT\n */\n/* Credit to ht"
  },
  {
    "path": "docs/css/jazzy.css",
    "chars": 8393,
    "preview": "/*! Jazzy - https://github.com/realm/jazzy\n *  Copyright Realm Inc.\n *  SPDX-License-Identifier: MIT\n */\n*, *:before, *:"
  },
  {
    "path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Info.plist",
    "chars": 662,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/Classes/NVActivityIndicatorView.html",
    "chars": 22956,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>NVActivityIndicatorView Class Reference</title>\n    <link rel=\"styl"
  },
  {
    "path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/Classes.html",
    "chars": 4471,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Classes  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/cs"
  },
  {
    "path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/Enums/NVActivityIndicatorType.html",
    "chars": 31007,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>NVActivityIndicatorType Enumeration Reference</title>\n    <link rel"
  },
  {
    "path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/Enums.html",
    "chars": 6556,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Enumerations  Reference</title>\n    <link rel=\"stylesheet\" type=\"te"
  },
  {
    "path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/Typealiases.html",
    "chars": 5284,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Type Aliases  Reference</title>\n    <link rel=\"stylesheet\" type=\"te"
  },
  {
    "path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/css/highlight.css",
    "chars": 2864,
    "preview": "/*! Jazzy - https://github.com/realm/jazzy\n *  Copyright Realm Inc.\n *  SPDX-License-Identifier: MIT\n */\n/* Credit to ht"
  },
  {
    "path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/css/jazzy.css",
    "chars": 8393,
    "preview": "/*! Jazzy - https://github.com/realm/jazzy\n *  Copyright Realm Inc.\n *  SPDX-License-Identifier: MIT\n */\n*, *:before, *:"
  },
  {
    "path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/index.html",
    "chars": 10878,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>NVActivityIndicatorView  Reference</title>\n    <link rel=\"styleshee"
  },
  {
    "path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/js/jazzy.js",
    "chars": 1876,
    "preview": "// Jazzy - https://github.com/realm/jazzy\n// Copyright Realm Inc.\n// SPDX-License-Identifier: MIT\n\nwindow.jazzy = {'docs"
  },
  {
    "path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/js/jazzy.search.js",
    "chars": 2100,
    "preview": "// Jazzy - https://github.com/realm/jazzy\n// Copyright Realm Inc.\n// SPDX-License-Identifier: MIT\n\n$(function(){\n  var $"
  },
  {
    "path": "docs/docsets/NVActivityIndicatorView.docset/Contents/Resources/Documents/js/typeahead.jquery.js",
    "chars": 70178,
    "preview": "/*!\n * typeahead.js 1.3.3\n * https://github.com/corejavascript/typeahead.js\n * Copyright 2013-2024 Twitter, Inc. and oth"
  },
  {
    "path": "docs/index.html",
    "chars": 10878,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>NVActivityIndicatorView  Reference</title>\n    <link rel=\"styleshee"
  },
  {
    "path": "docs/js/jazzy.js",
    "chars": 1876,
    "preview": "// Jazzy - https://github.com/realm/jazzy\n// Copyright Realm Inc.\n// SPDX-License-Identifier: MIT\n\nwindow.jazzy = {'docs"
  },
  {
    "path": "docs/js/jazzy.search.js",
    "chars": 2100,
    "preview": "// Jazzy - https://github.com/realm/jazzy\n// Copyright Realm Inc.\n// SPDX-License-Identifier: MIT\n\n$(function(){\n  var $"
  },
  {
    "path": "docs/js/typeahead.jquery.js",
    "chars": 70178,
    "preview": "/*!\n * typeahead.js 1.3.3\n * https://github.com/corejavascript/typeahead.js\n * Copyright 2013-2024 Twitter, Inc. and oth"
  },
  {
    "path": "docs/undocumented.json",
    "chars": 101,
    "preview": "{\n  \"warnings\": [\n\n  ],\n  \"source_directory\": \"/Users/vinhnguyen/Workspace/NVActivityIndicatorView\"\n}"
  },
  {
    "path": "scripts/bump-version.sh",
    "chars": 217,
    "preview": "#!/bin/bash\n\ntype=\"${1:-patch}\"\n\nfastlane run increment_build_number\nfastlane run increment_version_number bump_type:\"$t"
  }
]

// ... and 2 more files (download for full content)

About this extraction

This page contains the full source code of the ninjaprox/NVActivityIndicatorView GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 100 files (615.7 KB), approximately 148.9k tokens, and a symbol index with 100 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!