diff --git a/docs/docs/abstractions.md b/docs/docs/abstractions.md new file mode 100644 index 0000000..a90a983 --- /dev/null +++ b/docs/docs/abstractions.md @@ -0,0 +1,138 @@ +# C++ Plugin API + +The in-depth documentation for the classes and abstractions in the C++ plugin API. + +--- + +## File + +A file path with associated metadata. + +The File is one of two important data structures in OpenBR (the Template is the other). +It is typically used to store the path to a file on disk with associated metadata. +The ability to associate a key/value metadata table with the file helps keep the API simple while providing customizable behavior. + +When querying the value of a metadata key, the value will first try to be resolved against the file's private metadata table. +If the key does not exist in its local table then it will be resolved against the properties in the global Context. +By design file metadata may be set globally using Context::setProperty to operate on all files. + +Files have a simple grammar that allow them to be converted to and from strings. +If a string ends with a \c ] or \c ) then the text within the final \c [] or \c () are parsed as comma separated metadata fields. +By convention, fields within \c [] are expected to have the format [key1=value1, key2=value2, ..., keyN=valueN] where order is irrelevant. +Fields within \c () are expected to have the format (value1, value2, ..., valueN) where order matters and the key context dependent. +The left hand side of the string not parsed in a manner described above is assigned to #name. + +Values are not necessarily stored as strings in the metadata table. +The system will attempt to infer and convert them to their "native" type. +The conversion logic is as follows: + +1. If the value starts with \c [ and ends with \c ] then it is treated as a comma separated list and represented with \c QVariantList. Each value in the list is parsed recursively. +2. If the value starts with \c ( and ends with \c ) and contains four comma separated elements, each convertable to a floating point number, then it is represented with \c QRectF. +3. If the value starts with \c ( and ends with \c ) and contains two comma separated elements, each convertable to a floating point number, then it is represented with \c QPointF. +4. If the value is convertable to a floating point number then it is represented with \c float. +5. Otherwise, it is represented with \c QString. + +Metadata keys fall into one of two categories: +* \c camelCaseKeys are inputs that specify how to process the file. +* \c Capitalized_Underscored_Keys are outputs computed from processing the file. + +Below are some of the most commonly occuring standardized keys: + +Key | Value | Description +--- | ---- | ----------- +name | QString | Contents of #name +separator | QString | Seperate #name into multiple files +Index | int | Index of a template in a template list +Confidence | float | Classification/Regression quality +FTE | bool | Failure to enroll +FTO | bool | Failure to open +*_X | float | Position +*_Y | float | Position +*_Width | float | Size +*_Height | float | Size +*_Radius | float | Size +Label | QString | Class label +Theta | float | Pose +Roll | float | Pose +Pitch | float | Pose +Yaw | float | Pose +Points | QList | List of unnamed points +Rects | QList | List of unnamed rects +Age | float | Age used for demographic filtering +Gender | QString | Subject gender +Train | bool | The data is for training, as opposed to enrollment +_* | * | Reserved for internal use + +### Members + +#### Name + +Path to a file on disk + +#### FTE + +'Failed to enroll'. If true this file failed to be processed somewhere in the template enrollment algorithm + +#### m_metadata + +Map for storing metadata. It is a QString, QVariant key value pairing. + +--- + +## Template + +--- + +## Transform + +--- + +## UntrainableTransform + +--- + +## MetaTransform + +--- + +## UntrainableMetaTransform + +--- + +## MetadataTransform + +--- + +## UntrainableMetadataTransform + +--- + +## TimeVaryingTransform + +--- + +## Distance + +--- + +## UntrainableDistance + +--- + +## Output + +--- + +## MatrixOutput + +--- + +## Format + +--- + +## Representation + +--- + +## Classifier diff --git a/docs/docs/img/abstraction.svg b/docs/docs/img/abstraction.svg new file mode 100644 index 0000000..49dae6c --- /dev/null +++ b/docs/docs/img/abstraction.svg @@ -0,0 +1,484 @@ + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + br + OpenBR + + Qt &OpenCV + + + + + + LBP + HOG + SVM + + ... + CommercialWrapper + CommercialApplication + + + Source Code + Shared Library + Application + Plugin + + + + CommercialLibrary + + Open SourceApplication + + + CoreFramework + + + + PCA + LDA + + diff --git a/docs/docs/index.md b/docs/docs/index.md new file mode 100644 index 0000000..60ce2fd --- /dev/null +++ b/docs/docs/index.md @@ -0,0 +1,58 @@ +# OpenBR + +Open source, industry quality biometrics. + +--- + +## Overview + +OpenBR \cite klontz2013open is a framework for investigating new modalities, improving existing algorithms, interfacing with commercial systems, measuring recognition performance, and deploying automated biometric systems. +The project is designed to facilitate rapid algorithm prototyping, and features a mature core framework, flexible plugin system, and support for open and closed source development. +Off-the-shelf algorithms are also available for specific modalities including **face recognition**, **age estimation**, and **gender estimation**. Please see the [Tutorials](tutorials.md) section for more information. + +OpenBR originated within The MITRE Corporation from a need to streamline the process of prototyping new algorithms. +The project was later published as open source software under the Apache 2 license and is free for academic and commercial use. + + + +*The two principal software artifacts are the shared library 'openbr' and command line application 'br'.* + +--- + +## Getting Started + +OpenBR is supported on multiple operating systems. Please select yours from the list below for installation instructions. Happy Hacking! + +* [Linux](install.md#linux) +* [Mac OSX](install.md#osx) +* [Windows](install.md#windows) +* [Raspian](install.md#raspian) + +--- + +## The Basics + +We have created a few tutorials to help teach you the basic principles of the OpenBR system. If this is your first time using OpenBR you should look at these before moving on to the more technical descriptions below. + +* [OpenBR in 10 minutes or less!](tutorials.md#openbr in 10 minutes or less!) +* [Face Recognition](tutorials.md#face recognition) +* [Age Estimation](tutorials.md#age estimation) +* [Gender Estimation](tutorials.md#gender estimation) + +--- + +## Additional Materials + +OpenBR has several parts. For a brief overview of the entire framework please see [OpenBR in 10 minutes or less!](tutorials.md#openbr in 10 minutes or less!). Below are several more technical descriptions of important parts of the system. Enjoy! + +* [Algorithms in OpenBR](technical.md#algorithms in openbr) +* [The Command Line Interface](technical.md#the command line interface) +* [The C API](technical.md#the c api) +* [The C++ Plugin API](technical.md#the c++ plugin api) +* [The Evaluation Harness](technical.md#the evaluation harness) + +--- + +## Help + +Still have questions? Please reach out to us on our developer mailing list or our IRC channel diff --git a/docs/docs/install.md b/docs/docs/install.md new file mode 100644 index 0000000..3255d4d --- /dev/null +++ b/docs/docs/install.md @@ -0,0 +1,312 @@ +# Build Instructions + +A hacker's guide to building, editing, and running OpenBR. + +--- + +## Linux + +1. Install GCC 4.7.3 + + $ sudo apt-get update + $ sudo apt-get install build-essential + +2. Install CMake 2.8.10.1 + + $ sudo apt-get install cmake cmake-curses-gui + +3. Download OpenCV 2.4.5, **note** this + + $ cd ~/Downloads + $ tar -xf opencv-2.4.5.tar.gz + $ cd opencv-2.4.5 + $ mkdir build + $ cd build + $ cmake -DCMAKE_BUILD_TYPE=Release .. + $ make -j4 + $ sudo make install + $ cd ../.. + $ rm -rf opencv-2.4.5* + + +4. Install Qt 5.0.1 + + $ sudo apt-get install qt5-default libqt5svg5-dev qtcreator + +5. Create a GitHub account, follow their instructions for setting up Git. + + $ git clone https://github.com/biometrics/openbr.git + $ cd openbr + $ git checkout 0.5 + $ git submodule init + $ git submodule update + +6. Build OpenBR! + + $ mkdir build # from the OpenBR root directory + $ cd build + $ cmake -DCMAKE_BUILD_TYPE=Release .. + $ make -j4 + $ sudo make install + +7. Hack OpenBR! + 1. Open Qt Creator IDE + + $ qtcreator & + + 2. From the Qt Creator "File" menu select "Open File or Project...". + 3. Select "openbr/CMakeLists.txt" then "Open". + 4. Browse to your pre-existing build directory "openbr/build" then select "Next". + 5. Select "Run CMake" then "Finish". + 6. You're all set! You can find more information on Qt Creator here if you need. + +8. (Optional) Test OpenBR! + + $ cd openbr/scripts + $ ./downloadDatasets.sh + $ cd ../build + $ make test + +9. (Optional) Package OpenBR! + + $ cd openbr/build + $ sudo cpack -G TGZ + +10. (Optional) Build OpenBR documentation! + + $ sudo apt-get install doxygen + $ cd openbr/build + $ cmake -DBR_BUILD_DOCUMENTATION=ON .. + $ make -j4 + $ sudo apt-get install libgnome2-bin + $ gnome-open html/index.html + +--- + +## OSX + +1. Download and install the latest "Xcode" and "Command Line Tools" from the Apple Developer Downloads page. + 1. Download CMake 2.8.11.2 + + $ cd ~/Downloads + $ tar -xf cmake-2.8.11.2.tar.gz + $ cd cmake-2.8.11.2 + $ ./configure + $ make -j4 + $ sudo make install + $ cd .. + $ rm -rf cmake-2.8.11.2* + +2. Download OpenCV 2.4.6.1 + + $ cd ~/Downloads + $ tar -xf opencv-2.4.6.1.tar.gz + $ cd opencv-2.4.6.1 + $ mkdir build + $ cd build + $ cmake -DCMAKE_BUILD_TYPE=Release .. + $ make -j4 + $ sudo make install + $ cd ../.. + $ rm -rf opencv-2.4.6.1* + +3. Download and install Qt 5.1.1 + +4. Create a GitHub account, follow their instructions for setting up Git. + + $ git clone https://github.com/biometrics/openbr.git + $ cd openbr + $ git checkout 0.5 + $ git submodule init + $ git submodule update + +5. Build OpenBR! + + $ mkdir build # from the OpenBR root directory + $ cd build + $ cmake -DCMAKE_PREFIX_PATH=~/Qt5.1.1/5.1.1/clang_64 -DCMAKE_BUILD_TYPE=Release .. + $ make -j4 + $ sudo make install + +6. Hack OpenBR! + 1. Open Qt Creator IDE + + $ open ~/Qt5.1.1/Qt\ Creator.app + + 2. From the Qt Creator "File" menu select "Open File or Project...". + 3. Select "openbr/CMakeLists.txt" then "Open". + 4. Browse to your pre-existing build directory "openbr/build" then select "Continue". + 5. Select "Run CMake" then "Done". + 6. You're all set! You can find more information on Qt Creator here if you need. + +7. (Optional) Test OpenBR! + + $ cd openbr/scripts + $ ./downloadDatasets.sh + $ cd ../build + $ make test + + +8. (Optional) Package OpenBR! + + $ cd openbr/build + $ sudo cpack -G TGZ + + +9. (Optional) Build OpenBR documentation! + 1. Download Doxygen 1.8.5 + + $ cd ~/Downloads + $ tar -xf doxygen-1.8.5.src.tar.gz + $ cd doxygen-1.8.5 + $ ./configure + $ make -j4 + $ sudo make install + $ cd .. + $ rm -rf doxygen-1.8.5* + + + 2. Modify build settings and recompile. + + $ cd openbr/build + $ cmake -DBR_BUILD_DOCUMENTATION=ON .. + $ make -j4 + $ open html/index.html + +--- + +## Windows + +1. Download Visual Studio 2012 Express Edition for Windows Desktop and install. + 1. Consider the free open source program WinCDEmu if you need a program to mount ISO images. + 2. You will have to register with Microsoft after installation, but it's free. + 3. Grab any available Visual Studio Updates. + 4. Download and install Windows 8 SDK. + +2. Download and Install CMake 2.8.11.2 + 1. During installation setup select "add CMake to PATH". + +3. Download OpenCV 2.4.6.1 + 1. Consider the free open source program 7-Zip if you need a program to unarchive tarballs. + 2. Move the "opencv-2.4.6.1" folder to "C:\". + 3. Open "VS2012 x64 Cross Tools Command Prompt" (from the Start Menu, select "All Programs" -> "Microsoft Visual Studio 2012" -> "Visual Studio Tools" -> "VS2012 x64 Cross Tools Command Prompt") and enter: + + $ cd C:\opencv-2.4.6.1 + $ mkdir build-msvc2012 + $ cd build-msvc2012 + $ cmake -G "NMake Makefiles" -DBUILD_PERF_TESTS=OFF -DBUILD_TESTS=OFF -DWITH_FFMPEG=OFF -DCMAKE_BUILD_TYPE=Debug .. + $ nmake + $ nmake install + $ cmake -DCMAKE_BUILD_TYPE=Release .. + $ nmake + $ nmake install + $ nmake clean + +4. Download and Install Qt 5.1.1 + +5. Create a GitHub account and follow their instructions for setting up Git. + 1. Launch "Git Bash" from the Desktop and clone OpenBR: + + $ cd /c + $ git clone https://github.com/biometrics/openbr.git + $ cd openbr + $ git checkout 0.5 + $ git submodule init + $ git submodule update + +6. Build OpenBR! + 1. From the VS2012 x64 Cross Tools Command Prompt: + + $ cd C:\openbr + $ mkdir build-msvc2012 + $ cd build-msvc2012 + $ cmake -G "CodeBlocks - NMake Makefiles" -DCMAKE_PREFIX_PATH="C:/opencv-2.4.6.1/build-msvc2012/install;C:/Qt/Qt5.1.1/5.1.1/msvc2012_64" -DCMAKE_INSTALL_PREFIX="./install" -DBR_INSTALL_DEPENDENCIES=ON -DCMAKE_BUILD_TYPE=Release .. + $ nmake + $ nmake install + + 2. Check out the "install" folder. + +7. Hack OpenBR! + 1. From the VS2012 x64 Cross Tools Command Prompt: + $ C:\Qt\Qt5.1.1\Tools\QtCreator\bin\qtcreator.exe + 2. From the Qt Creator "Tools" menu select "Options..." + 3. Under "Kits" select "Desktop (default)" + 4. For "Compiler:" select "Microsoft Visual C++ Compiler 11.0 (x86_amd64)" and click "OK" + 5. From the Qt Creator "File" menu select "Open File or Project...". + 6. Select "C:\openbr\CMakeLists.txt" then "Open". + 7. If prompted for the location of CMake, enter "C:\Program Files (x86)\CMake 2.8\bin\cmake.exe". + 8. Browse to your pre-existing build directory "C:\openbr\build-msvc2012" then select "Next". + 9. Select "Run CMake" then "Finish". + 10. You're all set! You can find more information on Qt Creator here if you need. + +8. (Optional) Package OpenBR! + 1. From the VS2012 x64 Cross Tools Command Prompt: + $ cd C:\openbr\build-msvc2012 + $ cpack -G ZIP + +--- + +## Raspian + +1. Install CMake 2.8.9 + + $ sudo apt-get install cmake + + +2. Download OpenCV 2.4.9 + + $ wget http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.9/opencv-2.4.9.zip + $ unzip opencv-2.4.9.zip + $ cd opencv-2.4.9 + $ mkdir build + $ cd build + $ cmake -DCMAKE_BUILD_TYPE=Release .. + $ make + $ sudo make install + $ cd ../.. + $ rm -rf opencv-2.4.9* + +3. Install Qt5 + 1. Modify source list + + $ nano /etc/apt/sources.list + + by changing: + + $ deb http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi + + to: + + $ deb http://mirrordirector.raspbian.org/raspbian/ jessie main contrib non-free rpi + +4. Update apt-get + + $ sudo apt-get update + +5. Install packages + + $ sudo apt-get install qt5-default libqt5svg5-dev + +6. Create a GitHub account, follow their instructions for setting up Git. + + $ git clone https://github.com/biometrics/openbr.git + $ cd openbr + $ git checkout 0.5 + $ git submodule init + $ git submodule update + + +7. Build OpenBR! + + $ mkdir build # from the OpenBR root directory + $ cd build + $ cmake -DCMAKE_BUILD_TYPE=Release .. + $ make + $ sudo make install + +8. (Optional) Test OpenBR! + + $ cd openbr/scripts + $ ./downloadDatasets.sh + $ cd ../build + $ make test diff --git a/docs/docs/plugins.md b/docs/docs/plugins.md new file mode 100644 index 0000000..f513037 --- /dev/null +++ b/docs/docs/plugins.md @@ -0,0 +1,3401 @@ +# Plugins + +A description of all of the plugins available in OpenBR, broken down by module. This section assumes knowledge of the [C++ Plugin API](technical.md#c++ plugin api) and the [plugin abstractions](abstractions.md). + +## Classification + +--- + +#### AdaBoostTransform + +Wraps OpenCV's Ada Boost framework + +* **file:** classification/adaboost.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **author:** Scott Klum +* **properties:** None + +--- + +#### EBIFTransform + +Face Recognition Using Early Biologically Inspired Features + +* **file:** classification/ebif.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### ForestTransform + +Wraps OpenCV's random trees framework + +* **file:** classification/forest.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **author:** Scott Klum +* **properties:** None + +--- + +#### ForestInductionTransform + +Wraps OpenCV's random trees framework to induce features + +* **file:** classification/forest.cpp +* **inherits:** [ForestTransform](abstractions.md#foresttransform) +* **author:** Scott Klum +* **properties:** None + +--- + +#### IPC2013Initializer + +Initializes Intel Perceptual Computing SDK 2013 + +* **file:** classification/ipc2013.cpp +* **inherits:** [Initializer](abstractions.md#initializer) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### IPC2013FaceRecognitionTransfrom + +Intel Perceptual Computing SDK 2013 Face Recognition + +* **file:** classification/ipc2013.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### EigenInitializer + +Initialize Eigen + +* **file:** classification/lda.cpp +* **inherits:** [Initializer](abstractions.md#initializer) +* **author:** Scott Klum +* **properties:** None + +--- + +#### PCATransform + +Projects input into learned Principal Component Analysis subspace. + +* **file:** classification/lda.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **authors:** Brendan Klare, Josh Klontz +* **properties:** None + +--- + +#### RowWisePCATransform + +PCA on each row. + +* **file:** classification/lda.cpp +* **inherits:** [PCATransform](abstractions.md#pcatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### DFFSTransform + +Computes Distance From Feature Space (DFFS) + +* **file:** classification/lda.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### LDATransform + +Projects input into learned Linear Discriminant Analysis subspace. + +* **file:** classification/lda.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **authors:** Brendan Klare, Josh Klontz +* **properties:** None + +--- + +#### SparseLDATransform + +Projects input into learned Linear Discriminant Analysis subspace + +* **file:** classification/lda.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **author:** Brendan Klare +* **properties:** None + +--- + +#### MLPTransform + +Wraps OpenCV's multi-layer perceptron framework + +* **file:** classification/mlp.cpp +* **inherits:** [MetaTransform](abstractions.md#metatransform) +* **author:** Scott Klum +* **properties:** None + +--- + +#### NT4Initializer + +Initialize Neurotech SDK 4 + +* **file:** classification/nt4.cpp +* **inherits:** [Initializer](abstractions.md#initializer) +* **authors:** Josh Klontz, E. Taborsky +* **properties:** None + +--- + +#### NT4DetectFace + +Neurotech face detection + +* **file:** classification/nt4.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **authors:** Josh Klontz, E. Taborsky +* **properties:** None + +--- + +#### NT4EnrollFace + +Enroll face in Neurotech SDK 4 + +* **file:** classification/nt4.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### NT4EnrollIris + +Enroll iris in Neurotech SDK 4 + +* **file:** classification/nt4.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** E. Taborsky +* **properties:** None + +--- + +#### NT4Compare + +Compare templates with Neurotech SDK 4 + +* **file:** classification/nt4.cpp +* **inherits:** [Distance](abstractions.md#distance) +* **authors:** Josh Klontz, E. Taborsky +* **properties:** None + +--- + +#### PP4Initializer + +Initialize PittPatt 4 + +* **file:** classification/pp4.cpp +* **inherits:** [Initializer](abstractions.md#initializer) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### PP4EnrollTransform + +Enroll faces in PittPatt 4 + +* **file:** classification/pp4.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### PP5Initializer + +Initialize PP5 + +* **file:** classification/pp5.cpp +* **inherits:** [Initializer](abstractions.md#initializer) +* **authors:** Josh Klontz, E. Taborsky +* **properties:** None + +--- + +#### PP5EnrollTransform + +Enroll faces in PP5 + +* **file:** classification/pp5.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **authors:** Josh Klontz, E. Taborsky +* **properties:** None + +--- + +#### PP5CompareDistance + +Compare templates with PP5 + +* **file:** classification/pp5.cpp +* **inherits:** [UntrainableDistance](abstractions.md#untrainabledistance) +* **authors:** Josh Klontz, E. Taborsky +* **properties:** None + +--- + +#### SVMTransform + +C. Burges. "A tutorial on support vector machines for pattern recognition," + +* **file:** classification/svm.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### SVMDistance + +SVM Regression on template absolute differences. + +* **file:** classification/svm.cpp +* **inherits:** [Distance](abstractions.md#distance) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### TurkClassifierTransform + +Convenience class for training turk attribute regressors + +* **file:** classification/turk.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **author:** Josh Klontz +* **properties:** None + +## Cluster + +--- + +#### CollectNNTransform + +Collect nearest neighbors and append them to metadata. + +* **file:** cluster/collectnn.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Charles Otto +* **properties:** None + +--- + +#### KMeansTransform + +Wraps OpenCV kmeans and flann. + +* **file:** cluster/kmeans.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### KNNTransform + +K nearest neighbors classifier. + +* **file:** cluster/knn.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### LogNNTransform + +Log nearest neighbors to specified file. + +* **file:** cluster/lognn.cpp +* **inherits:** [TimeVaryingTransform](abstractions.md#timevaryingtransform) +* **author:** Charles Otto +* **properties:** None + +--- + +#### RandomCentroidsTransform + +Chooses k random points to be centroids. + +* **file:** cluster/randomcentroids.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **author:** Austin Blanton +* **properties:** None + +## Core + +--- + +#### AlgorithmsInitializer + +Initializes global abbreviations with implemented algorithms + +* **file:** core/algorithms.cpp +* **inherits:** [Initializer](abstractions.md#initializer) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### ProcrustesAlignTransform + +Improved procrustes alignment of points, to include a post processing scaling of points + +* **file:** core/align.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **author:** Brendan Klare +* **properties:** None + +--- + +#### TextureMapTransform + +Maps texture from one set of points to another. Assumes that points are rigidly transformed + +* **file:** core/align.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **authors:** Brendan Klare, Scott Klum +* **properties:** None + +--- + +#### SynthesizePointsTransform + +Synthesize additional points via triangulation. + +* **file:** core/align.cpp +* **inherits:** [MetadataTransform](abstractions.md#metadatatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### ProcrustesInitializer + +Initialize Procrustes croppings + +* **file:** core/align.cpp +* **inherits:** [Initializer](abstractions.md#initializer) +* **author:** Brendan Klare +* **properties:** None + +--- + +#### AttributeAlgorithmsInitializer + +Initializes global abbreviations with implemented algorithms for attributes + +* **file:** core/attributealgorithms.cpp +* **inherits:** [Initializer](abstractions.md#initializer) +* **author:** Babatunde Ogunfemi +* **properties:** None + +--- + +#### CacheTransform + +Caches br::Transform::project() results. + +* **file:** core/cache.cpp +* **inherits:** [MetaTransform](abstractions.md#metatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### ContractTransform + +It's like the opposite of ExpandTransform, but not really + +* **file:** core/contract.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Charles Otto +* **properties:** None + +--- + +#### CrossValidateTransform + +Cross validate a trainable transform. + +* **file:** core/crossvalidate.cpp +* **inherits:** [MetaTransform](abstractions.md#metatransform) +* **authors:** Josh Klontz, Scott Klum +* **properties:** None + +--- + +#### DiscardTransform + +Removes all template's matrices. + +* **file:** core/discard.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### ExpandTransform + +Performs an expansion step on input templatelists + +* **file:** core/expand.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### FirstTransform + +Removes all but the first matrix from the template. + +* **file:** core/first.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### ForkTransform + +Transforms in parallel. + +* **file:** core/fork.cpp +* **inherits:** [CompositeTransform](abstractions.md#compositetransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### FTETransform + +Flags images that failed to enroll based on the specified transform. + +* **file:** core/fte.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### GalleryCompareTransform + +Compare each template to a fixed gallery (with name = galleryName), using the specified distance. + +* **file:** core/gallerycompare.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **author:** Charles Otto +* **properties:** None + +--- + +#### IdentityTransform + +A no-op transform. + +* **file:** core/identity.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### IndependentTransform + +Clones the transform so that it can be applied independently. + +* **file:** core/independent.cpp +* **inherits:** [MetaTransform](abstractions.md#metatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### JNIInitializer + +Initialize JNI + +* **file:** core/jni.cpp +* **inherits:** [Initializer](abstractions.md#initializer) +* **author:** Jordan Cheney +* **properties:** None + +--- + +#### LikelyTransform + +Generic interface to Likely JIT compiler + +* **file:** core/likely.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### LoadStoreTransform + +Caches transform training. + +* **file:** core/loadstore.cpp +* **inherits:** [MetaTransform](abstractions.md#metatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### PipeTransform + +Transforms in series. + +* **file:** core/pipe.cpp +* **inherits:** [CompositeTransform](abstractions.md#compositetransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### ProcessWrapperTransform + +Interface to a separate process + +* **file:** core/processwrapper.cpp +* **inherits:** [WrapperTransform](abstractions.md#wrappertransform) +* **author:** Charles Otto +* **properties:** None + +--- + +#### Registrar + +Register custom objects with Qt meta object system. + +* **file:** core/registrar.cpp +* **inherits:** [Initializer](abstractions.md#initializer) +* **author:** Charles Otto +* **properties:** None + +--- + +#### RestTransform + +Removes the first matrix from the template. + +* **file:** core/rest.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### SchrodingerTransform + +Generates two templates, one of which is passed through a transform and the other + +* **file:** core/schrodinger.cpp +* **inherits:** [MetaTransform](abstractions.md#metatransform) +* **author:** Scott Klum +* **properties:** None + +--- + +#### SingletonTransform + +A globally shared transform. + +* **file:** core/singleton.cpp +* **inherits:** [MetaTransform](abstractions.md#metatransform) +* **author:** Josh Klontz +* **properties:** None + +## Distance + +--- + +#### AttributeDistance + +Attenuation function based distance from attributes + +* **file:** distance/attribute.cpp +* **inherits:** [UntrainableDistance](abstractions.md#untrainabledistance) +* **author:** Scott Klum +* **properties:** None + +--- + +#### BayesianQuantizationDistance + +Bayesian quantization distance + +* **file:** distance/bayesianquantization.cpp +* **inherits:** [Distance](abstractions.md#distance) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### ByteL1Distance + +Fast 8-bit L1 distance + +* **file:** distance/byteL1.cpp +* **inherits:** [UntrainableDistance](abstractions.md#untrainabledistance) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### CrossValidateDistance + +Cross validate a distance metric. + +* **file:** distance/crossvalidate.cpp +* **inherits:** [UntrainableDistance](abstractions.md#untrainabledistance) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### DefaultDistance + +DistDistance wrapper. + +* **file:** distance/default.cpp +* **inherits:** [UntrainableDistance](abstractions.md#untrainabledistance) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### DistDistance + +Standard distance metrics + +* **file:** distance/dist.cpp +* **inherits:** [UntrainableDistance](abstractions.md#untrainabledistance) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### FilterDistance + +Checks target metadata against filters. + +* **file:** distance/filter.cpp +* **inherits:** [UntrainableDistance](abstractions.md#untrainabledistance) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### FuseDistance + +Fuses similarity scores across multiple matrices of compared templates + +* **file:** distance/fuse.cpp +* **inherits:** [Distance](abstractions.md#distance) +* **author:** Scott Klum +* **properties:** None + +--- + +#### HalfByteL1Distance + +Fast 4-bit L1 distance + +* **file:** distance/halfbyteL1.cpp +* **inherits:** [UntrainableDistance](abstractions.md#untrainabledistance) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### HeatMapDistance + +1v1 heat map comparison + +* **file:** distance/heatmap.cpp +* **inherits:** [Distance](abstractions.md#distance) +* **author:** Scott Klum +* **properties:** None + +--- + +#### IdenticalDistance + +Returns + +* **file:** distance/identical.cpp +* **inherits:** [UntrainableDistance](abstractions.md#untrainabledistance) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### KeyPointMatcherDistance + +Wraps OpenCV Key Point Matcher + +* **file:** distance/keypointmatcher.cpp +* **inherits:** [UntrainableDistance](abstractions.md#untrainabledistance) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### L1Distance + +L1 distance computed using eigen. + +* **file:** distance/L1.cpp +* **inherits:** [UntrainableDistance](abstractions.md#untrainabledistance) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### L2Distance + +L2 distance computed using eigen. + +* **file:** distance/L2.cpp +* **inherits:** [UntrainableDistance](abstractions.md#untrainabledistance) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### MatchProbabilityDistance + +Match Probability + +* **file:** distance/matchprobability.cpp +* **inherits:** [Distance](abstractions.md#distance) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### MetadataDistance + +Checks target metadata against query metadata. + +* **file:** distance/metadata.cpp +* **inherits:** [UntrainableDistance](abstractions.md#untrainabledistance) +* **author:** Scott Klum +* **properties:** None + +--- + +#### NegativeLogPlusOneDistance + +Returns -log(distance(a,b)+1) + +* **file:** distance/neglogplusone.cpp +* **inherits:** [UntrainableDistance](abstractions.md#untrainabledistance) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### OnlineDistance + +Online distance metric to attenuate match scores across multiple frames + +* **file:** distance/online.cpp +* **inherits:** [UntrainableDistance](abstractions.md#untrainabledistance) +* **author:** Brendan klare +* **properties:** None + +--- + +#### PipeDistance + +Distances in series. + +* **file:** distance/pipe.cpp +* **inherits:** [Distance](abstractions.md#distance) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### RejectDistance + +Sets distance to -FLOAT_MAX if a target template has/doesn't have a key. + +* **file:** distance/reject.cpp +* **inherits:** [UntrainableDistance](abstractions.md#untrainabledistance) +* **author:** Scott Klum +* **properties:** None + +--- + +#### SumDistance + +Sum match scores across multiple distances + +* **file:** distance/sum.cpp +* **inherits:** [UntrainableDistance](abstractions.md#untrainabledistance) +* **author:** Scott Klum +* **properties:** None + +--- + +#### TurkDistance + +Unmaps Turk HITs to be compared against query mats + +* **file:** distance/turk.cpp +* **inherits:** [UntrainableDistance](abstractions.md#untrainabledistance) +* **author:** Scott Klum +* **properties:** None + +--- + +#### UnitDistance + +Linear normalizes of a distance so the mean impostor score is 0 and the mean genuine score is 1. + +* **file:** distance/unit.cpp +* **inherits:** [Distance](abstractions.md#distance) +* **author:** Josh Klontz +* **properties:** None + +## Format + +--- + +#### binaryFormat + +A simple binary matrix format. + +* **file:** format/binary.cpp +* **inherits:** [Format](abstractions.md#format) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### csvFormat + +Reads a comma separated value file. + +* **file:** format/csv.cpp +* **inherits:** [Format](abstractions.md#format) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### ebtsFormat + +Reads FBI EBTS transactions. + +* **file:** format/ebts.cpp +* **inherits:** [Format](abstractions.md#format) +* **author:** Scott Klum +* **properties:** None + +--- + +#### lffsFormat + +Reads a NIST LFFS file. + +* **file:** format/lffs.cpp +* **inherits:** [Format](abstractions.md#format) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### lmatFormat + +Likely matrix format + +* **file:** format/lmat.cpp +* **inherits:** [Format](abstractions.md#format) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### matFormat + +MATLAB .mat format. + +* **file:** format/mat.cpp +* **inherits:** [Format](abstractions.md#format) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### mtxFormat + +Reads a NIST BEE similarity matrix. + +* **file:** format/mtx.cpp +* **inherits:** [Format](abstractions.md#format) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### maskFormat + +Reads a NIST BEE mask matrix. + +* **file:** format/mtx.cpp +* **inherits:** [mtxFormat](abstractions.md#mtxformat) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### nullFormat + +Returns an empty matrix. + +* **file:** format/null.cpp +* **inherits:** [Format](abstractions.md#format) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### postFormat + +Handle POST requests + +* **file:** format/post.cpp +* **inherits:** [Format](abstractions.md#format) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### rawFormat + +RAW format + +* **file:** format/raw.cpp +* **inherits:** [Format](abstractions.md#format) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### scoresFormat + +Reads in scores or ground truth from a text table. + +* **file:** format/scores.cpp +* **inherits:** [Format](abstractions.md#format) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### urlFormat + +Reads image files from the web. + +* **file:** format/url.cpp +* **inherits:** [Format](abstractions.md#format) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### videoFormat + +Read all frames of a video using OpenCV + +* **file:** format/video.cpp +* **inherits:** [Format](abstractions.md#format) +* **author:** Charles Otto +* **properties:** None + +--- + +#### webcamFormat + +Retrieves an image from a webcam. + +* **file:** format/video.cpp +* **inherits:** [Format](abstractions.md#format) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### DefaultFormat + +Reads image files. + +* **file:** format/video.cpp +* **inherits:** [Format](abstractions.md#format) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### xmlFormat + +Decodes images from Base64 xml + +* **file:** format/xml.cpp +* **inherits:** [Format](abstractions.md#format) +* **authors:** Scott Klum, Josh Klontz +* **properties:** None + +## Gallery + +--- + +#### arffGallery + +Weka ARFF file format. + +* **file:** gallery/arff.cpp +* **inherits:** [Gallery](abstractions.md#gallery) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### galGallery + +A binary gallery. + +* **file:** gallery/binary.cpp +* **inherits:** [BinaryGallery](abstractions.md#binarygallery) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### utGallery + +A contiguous array of br_universal_template. + +* **file:** gallery/binary.cpp +* **inherits:** [BinaryGallery](abstractions.md#binarygallery) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### urlGallery + +Newline-separated URLs. + +* **file:** gallery/binary.cpp +* **inherits:** [BinaryGallery](abstractions.md#binarygallery) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### jsonGallery + +Newline-separated JSON objects. + +* **file:** gallery/binary.cpp +* **inherits:** [BinaryGallery](abstractions.md#binarygallery) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### crawlGallery + +Crawl a root location for image files. + +* **file:** gallery/crawl.cpp +* **inherits:** [Gallery](abstractions.md#gallery) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### csvGallery + +Treats each line as a file. + +* **file:** gallery/csv.cpp +* **inherits:** [FileGallery](abstractions.md#filegallery) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### dbGallery + +Database input. + +* **file:** gallery/db.cpp +* **inherits:** [Gallery](abstractions.md#gallery) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### DefaultGallery + +Treats the gallery as a br::Format. + +* **file:** gallery/default.cpp +* **inherits:** [Gallery](abstractions.md#gallery) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### EmptyGallery + +Reads/writes templates to/from folders. + +* **file:** gallery/empty.cpp +* **inherits:** [Gallery](abstractions.md#gallery) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### FDDBGallery + +Implements the FDDB detection format. + +* **file:** gallery/fddb.cpp +* **inherits:** [Gallery](abstractions.md#gallery) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### flatGallery + +Treats each line as a call to File::flat() + +* **file:** gallery/flat.cpp +* **inherits:** [FileGallery](abstractions.md#filegallery) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### googleGallery + +Input from a google image search. + +* **file:** gallery/google.cpp +* **inherits:** [Gallery](abstractions.md#gallery) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### keyframesGallery + +Read key frames of a video with LibAV + +* **file:** gallery/keyframes.cpp +* **inherits:** [Gallery](abstractions.md#gallery) +* **author:** Ben Klein +* **properties:** None + +--- + +#### mp4Gallery + +Read key frames of a .mp4 video file with LibAV + +* **file:** gallery/keyframes.cpp +* **inherits:** [keyframesGallery](abstractions.md#keyframesgallery) +* **author:** Ben Klein +* **properties:** None + +--- + +#### landmarksGallery + +Text format for associating anonymous landmarks with images. + +* **file:** gallery/landmarks.cpp +* **inherits:** [Gallery](abstractions.md#gallery) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### lmatGallery + +Likely matrix format + +* **file:** gallery/lmat.cpp +* **inherits:** [Gallery](abstractions.md#gallery) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### matrixGallery + +Combine all templates into one large matrix and process it as a br::Format + +* **file:** gallery/matrix.cpp +* **inherits:** [Gallery](abstractions.md#gallery) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### MemoryGalleries + +Initialization support for memGallery. + +* **file:** gallery/mem.cpp +* **inherits:** [Initializer](abstractions.md#initializer) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### memGallery + +A gallery held in memory. + +* **file:** gallery/mem.cpp +* **inherits:** [Gallery](abstractions.md#gallery) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### postGallery + +Handle POST requests + +* **file:** gallery/post.cpp +* **inherits:** [Gallery](abstractions.md#gallery) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### statGallery + +Print template statistics. + +* **file:** gallery/stat.cpp +* **inherits:** [Gallery](abstractions.md#gallery) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### templateGallery + +Treat the file as a single binary template. + +* **file:** gallery/template.cpp +* **inherits:** [Gallery](abstractions.md#gallery) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### turkGallery + +For Amazon Mechanical Turk datasets + +* **file:** gallery/turk.cpp +* **inherits:** [Gallery](abstractions.md#gallery) +* **author:** Scott Klum +* **properties:** None + +--- + +#### txtGallery + +Treats each line as a file. + +* **file:** gallery/txt.cpp +* **inherits:** [FileGallery](abstractions.md#filegallery) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### xmlGallery + +A + +* **file:** gallery/xml.cpp +* **inherits:** [FileGallery](abstractions.md#filegallery) +* **author:** Josh Klontz +* **properties:** None + +## Gui + +--- + +#### AdjacentOverlayTransform + +Load the image named in the specified property, draw it on the current matrix adjacent to the rect specified in the other property. + +* **file:** gui/adjacentoverlay.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **author:** Charles Otto +* **properties:** None + +--- + +#### DrawTransform + +Renders metadata onto the image. + +* **file:** gui/draw.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### DrawDelaunayTransform + +Creates a Delaunay triangulation based on a set of points + +* **file:** gui/drawdelaunay.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Scott Klum +* **properties:** None + +--- + +#### DrawGridLinesTransform + +Draws a grid on the image + +* **file:** gui/drawgridlines.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### DrawOpticalFlow + +Draw a line representing the direction and magnitude of optical flow at the specified points. + +* **file:** gui/drawopticalflow.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Austin Blanton +* **properties:** None + +--- + +#### DrawPropertiesPointTransform + +Draw the values of a list of properties at the specified point on the image + +* **file:** gui/drawpropertiespoint.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Charles Otto +* **properties:** None + +--- + +#### DrawPropertyPointTransform + +Draw the value of the specified property at the specified point on the image + +* **file:** gui/drawpropertypoint.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Charles Otto +* **properties:** None + +--- + +#### DrawSegmentation + +Fill in the segmentations or draw a line between intersecting segments. + +* **file:** gui/drawsegmentation.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Austin Blanton +* **properties:** None + +--- + +#### ShowTransform + +Displays templates in a GUI pop-up window using QT. + +* **file:** gui/show.cpp +* **inherits:** [TimeVaryingTransform](abstractions.md#timevaryingtransform) +* **author:** Charles Otto +* **properties:** None + +--- + +#### ShowTrainingTransform + +Show the training data + +* **file:** gui/show.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### ManualTransform + +Manual selection of landmark locations + +* **file:** gui/show.cpp +* **inherits:** [ShowTransform](abstractions.md#showtransform) +* **author:** Scott Klum +* **properties:** None + +--- + +#### ManualRectsTransform + +Manual select rectangular regions on an image. + +* **file:** gui/show.cpp +* **inherits:** [ShowTransform](abstractions.md#showtransform) +* **author:** Charles Otto +* **properties:** None + +--- + +#### ElicitTransform + +Elicits metadata for templates in a pretty GUI + +* **file:** gui/show.cpp +* **inherits:** [ShowTransform](abstractions.md#showtransform) +* **author:** Scott Klum +* **properties:** None + +--- + +#### SurveyTransform + +Display an image, and asks a yes/no question about it + +* **file:** gui/show.cpp +* **inherits:** [ShowTransform](abstractions.md#showtransform) +* **author:** Charles Otto +* **properties:** None + +--- + +#### FPSLimit + +Limits the frequency of projects going through this transform to the input targetFPS + +* **file:** gui/show.cpp +* **inherits:** [TimeVaryingTransform](abstractions.md#timevaryingtransform) +* **author:** Charles Otto +* **properties:** None + +--- + +#### FPSCalc + +Calculates the average FPS of projects going through this transform, stores the result in AvgFPS + +* **file:** gui/show.cpp +* **inherits:** [TimeVaryingTransform](abstractions.md#timevaryingtransform) +* **author:** Charles Otto +* **properties:** None + +## Imgproc + +--- + +#### AbsTransform + +Computes the absolute value of each element. + +* **file:** imgproc/abs.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### AbsDiffTransform + +Take the absolute difference of two matrices. + +* **file:** imgproc/absdiff.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### AdaptiveThresholdTransform + +Wraps OpenCV's adaptive thresholding. + +* **file:** imgproc/adaptivethreshold.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Scott Klum +* **properties:** None + +--- + +#### AffineTransform + +Performs a two or three point registration. + +* **file:** imgproc/affine.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### AndTransform + +Logical AND of two matrices. + +* **file:** imgproc/and.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### ApplyMaskTransform + +Applies a mask from the metadata. + +* **file:** imgproc/applymask.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Austin Blanton +* **properties:** None + +--- + +#### BayesianQuantizationTransform + +Quantize into a space where L1 distance approximates log-likelihood. + +* **file:** imgproc/bayesianquantization.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### BinarizeTransform + +Approximate floats as signed bit. + +* **file:** imgproc/binarize.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### BlendTransform + +Alpha-blend two matrices + +* **file:** imgproc/blend.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### BlurTransform + +Gaussian blur + +* **file:** imgproc/blur.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### ByRowTransform + +Turns each row into its own matrix. + +* **file:** imgproc/byrow.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### CannyTransform + +Warpper to OpenCV Canny edge detector + +* **file:** imgproc/canny.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Scott Klum +* **properties:** None + +--- + +#### CatTransform + +Concatenates all input matrices into a single matrix. + +* **file:** imgproc/cat.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### CatColsTransform + +Concatenates all input matrices by column into a single matrix. + +* **file:** imgproc/catcols.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Austin Blanton +* **properties:** None + +--- + +#### CatRowsTransform + +Concatenates all input matrices by row into a single matrix. + +* **file:** imgproc/catrows.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### CenterTransform + +Normalize each dimension based on training data. + +* **file:** imgproc/center.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### ContrastEqTransform + +Xiaoyang Tan; Triggs, B.; + +* **file:** imgproc/contrasteq.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### CropTransform + +Crops about the specified region of interest. + +* **file:** imgproc/crop.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### CropBlackTransform + +Crop out black borders + +* **file:** imgproc/cropblack.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### CropFromMaskTransform + +Crops image based on mask metadata + +* **file:** imgproc/cropfrommask.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Brendan Klare +* **properties:** None + +--- + +#### CropSquareTransform + +Trim the image so the width and the height are the same size. + +* **file:** imgproc/cropsquare.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### CryptographicHashTransform + +Wraps QCryptographicHash + +* **file:** imgproc/cryptographichash.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### CvtTransform + +Colorspace conversion. + +* **file:** imgproc/cvt.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### CvtFloatTransform + +Convert to floating point format. + +* **file:** imgproc/cvtfloat.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### CvtUCharTransform + +Convert to uchar format + +* **file:** imgproc/cvtuchar.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### NLMeansDenoisingTransform + +Wraps OpenCV Non-Local Means Denoising + +* **file:** imgproc/denoising.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### DiscardAlphaTransform + +Drop the alpha channel (if exists). + +* **file:** imgproc/discardalpha.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Austin Blanton +* **properties:** None + +--- + +#### DivTransform + +Enforce a multiple of + +* **file:** imgproc/div.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### DoGTransform + +Difference of gaussians + +* **file:** imgproc/dog.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### DownsampleTransform + +Downsample the rows and columns of a matrix. + +* **file:** imgproc/downsample.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Lacey Best-Rowden +* **properties:** None + +--- + +#### DupTransform + +Duplicates the template data. + +* **file:** imgproc/dup.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### EnsureChannelsTransform + +Enforce the matrix has a certain number of channels by adding or removing channels. + +* **file:** imgproc/ensurechannels.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### EqualizeHistTransform + +Histogram equalization + +* **file:** imgproc/equalizehist.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### FlipTransform + +Flips the image about an axis. + +* **file:** imgproc/flip.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### FloodTransform + +Fill black pixels with the specified color. + +* **file:** imgproc/flood.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### GaborTransform + +http://en.wikipedia.org/wiki/Gabor_filter + +* **file:** imgproc/gabor.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### GaborJetTransform + +A vector of gabor wavelets applied at a point. + +* **file:** imgproc/gabor.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### GammaTransform + +Gamma correction + +* **file:** imgproc/gamma.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### GradientTransform + +Computes magnitude and/or angle of image. + +* **file:** imgproc/gradient.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### GradientMaskTransform + +Masks image according to pixel change. + +* **file:** imgproc/gradientmask.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### GroupTransform + +Group all input matrices into a single matrix. + +* **file:** imgproc/group.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### HistTransform + +Histograms the matrix + +* **file:** imgproc/hist.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### HistBinTransform + +Quantizes the values into bins. + +* **file:** imgproc/histbin.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### HistEqQuantizationTransform + +Approximate floats as uchar with different scalings for each dimension. + +* **file:** imgproc/histeqquantization.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### HoGDescriptorTransform + +OpenCV HOGDescriptor wrapper + +* **file:** imgproc/hog.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Austin Blanton +* **properties:** None + +--- + +#### InpaintTransform + +Wraps OpenCV inpainting + +* **file:** imgproc/inpaint.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### IntegralTransform + +Computes integral image. + +* **file:** imgproc/integral.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### IntegralHistTransform + +An integral histogram + +* **file:** imgproc/integralhist.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### IntegralSamplerTransform + +Sliding window feature extraction from a multi-channel integral image. + +* **file:** imgproc/integralsampler.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### KernelHashTransform + +Kernel hash + +* **file:** imgproc/kernelhash.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### KeyPointDescriptorTransform + +Wraps OpenCV Key Point Descriptor + +* **file:** imgproc/keypointdescriptor.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### LargestConvexAreaTransform + +Set the template's label to the area of the largest convex hull. + +* **file:** imgproc/largestconvexarea.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### LBPTransform + +Ahonen, T.; Hadid, A.; Pietikainen, M.; + +* **file:** imgproc/lbp.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### LimitSizeTransform + +Limit the size of the template + +* **file:** imgproc/limitsize.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### LTPTransform + +Tan, Xiaoyang, and Bill Triggs. "Enhanced local texture feature sets for face recognition under difficult lighting conditions." Analysis and Modeling of Faces and Gestures. Springer Berlin Heidelberg, 2007. 168-182. + +* **file:** imgproc/ltp.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **authors:** Brendan Klare, Josh Klontz +* **properties:** None + +--- + +#### MAddTransform + +dst = a*src+b + +* **file:** imgproc/madd.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### MaskTransform + +Applies an eliptical mask + +* **file:** imgproc/mask.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### MatStatsTransform + +Statistics + +* **file:** imgproc/matstats.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### MeanTransform + +Computes the mean of a set of templates. + +* **file:** imgproc/mean.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **author:** Scott Klum +* **properties:** None + +--- + +#### MeanFillTransform + +Fill 0 pixels with the mean of non-0 pixels. + +* **file:** imgproc/meanfill.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### MergeTransform + +Wraps OpenCV merge + +* **file:** imgproc/merge.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### MorphTransform + +Morphological operator + +* **file:** imgproc/morph.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### BuildScalesTransform + +Document me + +* **file:** imgproc/multiscale.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **author:** Austin Blanton +* **properties:** None + +--- + +#### NormalizeTransform + +Normalize matrix to unit length + +* **file:** imgproc/normalize.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** + + * **NormType**- Values are NORM_INF, NORM_L1, NORM_L2, NORM_MINMAX + * **ByRow**- If true normalize each row independently otherwise normalize the entire matrix. + * **alpha**- Lower bound if using NORM_MINMAX. Value to normalize to otherwise. + * **beta**- Upper bound if using NORM_MINMAX. Not used otherwise. + * **squareRoot**- If true compute the signed square root of the output after normalization. + + +--- + +#### OrigLinearRegressionTransform + +Prediction with magic numbers from jmp; must get input as blue;green;red + +* **file:** imgproc/origlinearregression.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** E. Taborsky +* **properties:** None + +--- + +#### PackTransform + +Compress two uchar into one uchar. + +* **file:** imgproc/pack.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### PowTransform + +Raise each element to the specified power. + +* **file:** imgproc/pow.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### ProductQuantizationDistance + +Distance in a product quantized space + +* **file:** imgproc/productquantization.cpp +* **inherits:** [UntrainableDistance](abstractions.md#untrainabledistance) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### ProductQuantizationTransform + +Product quantization + +* **file:** imgproc/productquantization.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### QuantizeTransform + +Approximate floats as uchar. + +* **file:** imgproc/quantize.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### RankTransform + +Converts each element to its rank-ordered value. + +* **file:** imgproc/rank.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### RectRegionsTransform + +Subdivide matrix into rectangular subregions. + +* **file:** imgproc/rectregions.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### RecursiveIntegralSamplerTransform + +Construct template in a recursive decent manner. + +* **file:** imgproc/recursiveintegralsampler.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### RedLinearRegressionTransform + +Prediction using only the red wavelength; magic numbers from jmp + +* **file:** imgproc/redlinearregression.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** E. Taborsky +* **properties:** None + +--- + +#### ReshapeTransform + +Reshape the each matrix to the specified number of rows. + +* **file:** imgproc/reshape.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### ResizeTransform + +Resize the template + +* **file:** imgproc/resize.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### RevertAffineTransform + +Designed for use after eye detection + Stasm, this will + +* **file:** imgproc/revertaffine.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Brendan Klare +* **properties:** None + +--- + +#### RGTransform + +Normalized RG color space. + +* **file:** imgproc/rg.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### RndPointTransform + +Generates a random landmark. + +* **file:** imgproc/rndpoint.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### RndRegionTransform + +Selects a random region. + +* **file:** imgproc/rndregion.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### RndRotateTransform + +Randomly rotates an image in a specified range. + +* **file:** imgproc/rndrotate.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Scott Klum +* **properties:** None + +--- + +#### RndSubspaceTransform + +Generates a random subspace. + +* **file:** imgproc/rndsubspace.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### ROITransform + +Crops the rectangular regions of interest. + +* **file:** imgproc/roi.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### ROIFromPtsTransform + +Crops the rectangular regions of interest from given points and sizes. + +* **file:** imgproc/roifrompoints.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Austin Blanton +* **properties:** None + +--- + +#### RootNormTransform + +dst=sqrt(norm_L1(src)) proposed as RootSIFT in + +* **file:** imgproc/rootnorm.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### RowWiseMeanCenterTransform + +Remove the row-wise training set average. + +* **file:** imgproc/rowwisemeancenter.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### SampleFromMaskTransform + +Samples pixels from a mask. + +* **file:** imgproc/samplefrommask.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Scott Klum +* **properties:** None + +--- + +#### ScaleTransform + +Scales using the given factor + +* **file:** imgproc/scale.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Scott Klum +* **properties:** None + +--- + +#### SIFTDescriptorTransform + +Specialize wrapper OpenCV SIFT wrapper + +* **file:** imgproc/sift.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### SkinMaskTransform + +http://worldofcameras.wordpress.com/tag/skin-detection-opencv/ + +* **file:** imgproc/skinmask.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### SlidingWindowTransform + +Applies a transform to a sliding window. + +* **file:** imgproc/slidingwindow.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **author:** Austin Blanton +* **properties:** None + +--- + +#### IntegralSlidingWindowTransform + +Overloads SlidingWindowTransform for integral images that should be + +* **file:** imgproc/slidingwindow.cpp +* **inherits:** [SlidingWindowTransform](abstractions.md#slidingwindowtransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### SplitChannelsTransform + +Split a multi-channel matrix into several single-channel matrices. + +* **file:** imgproc/splitchannels.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### SubdivideTransform + +Divide the matrix into 4 smaller matricies of equal size. + +* **file:** imgproc/subdivide.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### SubtractTransform + +Subtract two matrices. + +* **file:** imgproc/subtract.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### ThresholdTransform + +Wraps OpenCV's adaptive thresholding. + +* **file:** imgproc/threshold.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Scott Klum +* **properties:** None + +--- + +#### WatershedSegmentationTransform + +Applies watershed segmentation. + +* **file:** imgproc/watershedsegmentation.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Austin Blanton +* **properties:** None + +## Io + +--- + +#### DecodeTransform + +Decodes images + +* **file:** io/decode.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### DownloadTransform + +Downloads an image from a URL + +* **file:** io/download.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### IncrementalOutputTransform + +Incrementally output templates received to a gallery, based on the current filename + +* **file:** io/incrementaloutput.cpp +* **inherits:** [TimeVaryingTransform](abstractions.md#timevaryingtransform) +* **author:** Charles Otto +* **properties:** None + +--- + +#### OpenTransform + +Applies br::Format to br::Template::file::name and appends results. + +* **file:** io/open.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### PrintTransform + +Prints the template's file to stdout or stderr. + +* **file:** io/print.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### ReadTransform + +Read images + +* **file:** io/read.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### ReadLandmarksTransform + +Read landmarks from a file and associate them with the correct templates. + +* **file:** io/readlandmarks.cpp +* **inherits:** [UntrainableMetadataTransform](abstractions.md#untrainablemetadatatransform) +* **author:** Scott Klum +* **properties:** None + +--- + +#### WriteTransform + +Write all mats to disk as images. + +* **file:** io/write.cpp +* **inherits:** [TimeVaryingTransform](abstractions.md#timevaryingtransform) +* **author:** Brendan Klare +* **properties:** None + +--- + +#### YouTubeFacesDBTransform + +Implements the YouTubesFaceDB + +* **file:** io/youtubefacesdb.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Josh Klontz +* **properties:** None + +## Metadata + +--- + +#### AnonymizeLandmarksTransform + +Remove a name from a point/rect + +* **file:** metadata/anonymizelandmarks.cpp +* **inherits:** [UntrainableMetadataTransform](abstractions.md#untrainablemetadatatransform) +* **author:** Scott Klum +* **properties:** None + +--- + +#### AsTransform + +Change the br::Template::file extension + +* **file:** metadata/as.cpp +* **inherits:** [UntrainableMetadataTransform](abstractions.md#untrainablemetadatatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### AveragePointsTransform + +Averages a set of landmarks into a new landmark + +* **file:** metadata/averagepoints.cpp +* **inherits:** [UntrainableMetadataTransform](abstractions.md#untrainablemetadatatransform) +* **author:** Brendan Klare +* **properties:** None + +--- + +#### CascadeTransform + +Wraps OpenCV cascade classifier + +* **file:** metadata/cascade.cpp +* **inherits:** [MetaTransform](abstractions.md#metatransform) +* **authors:** Josh Klontz, David Crouse +* **properties:** None + +--- + +#### CheckTransform + +Checks the template for NaN values. + +* **file:** metadata/check.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### ClearPointsTransform + +Clears the points from a template + +* **file:** metadata/clearpoints.cpp +* **inherits:** [UntrainableMetadataTransform](abstractions.md#untrainablemetadatatransform) +* **author:** Brendan Klare +* **properties:** None + +--- + +#### ConsolidateDetectionsTransform + +Consolidate redundant/overlapping detections. + +* **file:** metadata/consolidatedetections.cpp +* **inherits:** [UntrainableMetadataTransform](abstractions.md#untrainablemetadatatransform) +* **author:** Brendan Klare +* **properties:** None + +--- + +#### CropRectTransform + +Crops the width and height of a template's rects by input width and height factors. + +* **file:** metadata/croprect.cpp +* **inherits:** [UntrainableMetadataTransform](abstractions.md#untrainablemetadatatransform) +* **author:** Scott Klum +* **properties:** None + +--- + +#### DelaunayTransform + +Creates a Delaunay triangulation based on a set of points + +* **file:** metadata/delaunay.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Scott Klum +* **properties:** None + +--- + +#### ExpandRectTransform + +Expand the width and height of a template's rects by input width and height factors. + +* **file:** metadata/expandrect.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Charles Otto +* **properties:** None + +--- + +#### ExtractMetadataTransform + +Create matrix from metadata values. + +* **file:** metadata/extractmetadata.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### ASEFEyesTransform + +Bolme, D.S.; Draper, B.A.; Beveridge, J.R.; + +* **file:** metadata/eyes.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **authors:** David Bolme, Josh Klontz +* **properties:** None + +--- + +#### FilterDupeMetadataTransform + +Removes duplicate templates based on a unique metadata key + +* **file:** metadata/filterdupemetadata.cpp +* **inherits:** [TimeVaryingTransform](abstractions.md#timevaryingtransform) +* **author:** Austin Blanton +* **properties:** None + +--- + +#### GridTransform + +Add landmarks to the template in a grid layout + +* **file:** metadata/grid.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### GroundTruthTransform + +Add any ground truth to the template using the file's base name. + +* **file:** metadata/groundtruth.cpp +* **inherits:** [UntrainableMetadataTransform](abstractions.md#untrainablemetadatatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### HOGPersonDetectorTransform + +Detects objects with OpenCV's built-in HOG detection. + +* **file:** metadata/hogpersondetector.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Austin Blanton +* **properties:** None + +--- + +#### IfMetadataTransform + +Clear templates without the required metadata. + +* **file:** metadata/ifmetadata.cpp +* **inherits:** [UntrainableMetadataTransform](abstractions.md#untrainablemetadatatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### ImpostorUniquenessMeasureTransform + +Impostor Uniqueness Measure + +* **file:** metadata/imposteruniquenessmeasure.cpp +* **inherits:** [Transform](abstractions.md#transform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### JSONTransform + +Represent the metadata as JSON template data. + +* **file:** metadata/json.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### KeepMetadataTransform + +Retains only the values for the keys listed, to reduce template size + +* **file:** metadata/keepmetadata.cpp +* **inherits:** [UntrainableMetadataTransform](abstractions.md#untrainablemetadatatransform) +* **author:** Scott Klum +* **properties:** None + +--- + +#### KeyPointDetectorTransform + +Wraps OpenCV Key Point Detector + +* **file:** metadata/keypointdetector.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### KeyToRectTransform + +Convert values of key_X, key_Y, key_Width, key_Height to a rect. + +* **file:** metadata/keytorect.cpp +* **inherits:** [UntrainableMetadataTransform](abstractions.md#untrainablemetadatatransform) +* **author:** Jordan Cheney +* **properties:** None + +--- + +#### MongooseInitializer + +Initialize mongoose server + +* **file:** metadata/mongoose.cpp +* **inherits:** [Initializer](abstractions.md#initializer) +* **author:** Unknown +* **properties:** None + +--- + +#### NameTransform + +Sets the template's matrix data to the br::File::name. + +* **file:** metadata/name.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### NameLandmarksTransform + +Name a point/rect + +* **file:** metadata/namelandmarks.cpp +* **inherits:** [UntrainableMetadataTransform](abstractions.md#untrainablemetadatatransform) +* **author:** Scott Klum +* **properties:** None + +--- + +#### NormalizePointsTransform + +Normalize points to be relative to a single point + +* **file:** metadata/normalizepoints.cpp +* **inherits:** [UntrainableMetadataTransform](abstractions.md#untrainablemetadatatransform) +* **author:** Scott Klum +* **properties:** None + +--- + +#### PointDisplacementTransform + +Normalize points to be relative to a single point + +* **file:** metadata/pointdisplacement.cpp +* **inherits:** [UntrainableMetadataTransform](abstractions.md#untrainablemetadatatransform) +* **author:** Scott Klum +* **properties:** None + +--- + +#### PointsToMatrixTransform + +Converts either the file::points() list or a QList metadata item to be the template's matrix + +* **file:** metadata/pointstomatrix.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Scott Klum +* **properties:** None + +--- + +#### ProcrustesTransform + +Procrustes alignment of points + +* **file:** metadata/procrustes.cpp +* **inherits:** [MetadataTransform](abstractions.md#metadatatransform) +* **author:** Scott Klum +* **properties:** None + +--- + +#### RectsToTemplatesTransform + +For each rectangle bounding box in src, a new + +* **file:** metadata/rectstotemplates.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Brendan Klare +* **properties:** None + +--- + +#### RegexPropertyTransform + +Apply the input regular expression to the value of inputProperty, store the matched portion in outputProperty. + +* **file:** metadata/regexproperty.cpp +* **inherits:** [UntrainableMetadataTransform](abstractions.md#untrainablemetadatatransform) +* **author:** Charles Otto +* **properties:** None + +--- + +#### RemoveMetadataTransform + +Removes a metadata field from all templates + +* **file:** metadata/removemetadata.cpp +* **inherits:** [UntrainableMetadataTransform](abstractions.md#untrainablemetadatatransform) +* **author:** Brendan Klare +* **properties:** None + +--- + +#### RemoveTemplatesTransform + +Remove templates with the specified file extension or metadata value. + +* **file:** metadata/removetemplates.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### RenameTransform + +Rename metadata key + +* **file:** metadata/rename.cpp +* **inherits:** [UntrainableMetadataTransform](abstractions.md#untrainablemetadatatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### RenameFirstTransform + +Rename first found metadata key + +* **file:** metadata/renamefirst.cpp +* **inherits:** [UntrainableMetadataTransform](abstractions.md#untrainablemetadatatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### ReorderPointsTransform + +Reorder the points such that points[from[i]] becomes points[to[i]] and + +* **file:** metadata/reorderpoints.cpp +* **inherits:** [UntrainableMetadataTransform](abstractions.md#untrainablemetadatatransform) +* **author:** Scott Klum +* **properties:** None + +--- + +#### RestoreMatTransform + +Set the last matrix of the input template to a matrix stored as metadata with input propName. + +* **file:** metadata/restoremat.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Charles Otto +* **properties:** None + +--- + +#### SaveMatTransform + +Store the last matrix of the input template as a metadata key with input property name. + +* **file:** metadata/savemat.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Charles Otto +* **properties:** None + +--- + +#### SelectPointsTransform + +Retains only landmarks/points at the provided indices + +* **file:** metadata/selectpoints.cpp +* **inherits:** [UntrainableMetadataTransform](abstractions.md#untrainablemetadatatransform) +* **author:** Brendan Klare +* **properties:** None + +--- + +#### SetMetadataTransform + +Sets the metadata key/value pair. + +* **file:** metadata/setmetadata.cpp +* **inherits:** [UntrainableMetadataTransform](abstractions.md#untrainablemetadatatransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### SetPointsInRectTransform + +Set points relative to a rect + +* **file:** metadata/setpointsinrect.cpp +* **inherits:** [UntrainableMetadataTransform](abstractions.md#untrainablemetadatatransform) +* **author:** Jordan Cheney +* **properties:** None + +--- + +#### StasmInitializer + +Initialize Stasm + +* **file:** metadata/stasm4.cpp +* **inherits:** [Initializer](abstractions.md#initializer) +* **author:** Scott Klum +* **properties:** None + +--- + +#### StasmTransform + +Wraps STASM key point detector + +* **file:** metadata/stasm4.cpp +* **inherits:** [UntrainableTransform](abstractions.md#untrainabletransform) +* **author:** Scott Klum +* **properties:** None + +--- + +#### StopWatchTransform + +Gives time elapsed over a specified transform as a function of both images (or frames) and pixels. + +* **file:** metadata/stopwatch.cpp +* **inherits:** [MetaTransform](abstractions.md#metatransform) +* **authors:** Jordan Cheney, Josh Klontz +* **properties:** None + +## Output + +--- + +#### bestOutput + +The highest scoring matches. + +* **file:** output/best.cpp +* **inherits:** [Output](abstractions.md#output) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### csvOutput + +Comma separated values output. + +* **file:** output/csv.cpp +* **inherits:** [MatrixOutput](abstractions.md#matrixoutput) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### DefaultOutput + +Adaptor class -- write a matrix output using Format classes. + +* **file:** output/default.cpp +* **inherits:** [MatrixOutput](abstractions.md#matrixoutput) +* **author:** Charles Otto +* **properties:** None + +--- + +#### EmptyOutput + +Output to the terminal. + +* **file:** output/empty.cpp +* **inherits:** [MatrixOutput](abstractions.md#matrixoutput) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### evalOutput + +Evaluate the output matrix. + +* **file:** output/eval.cpp +* **inherits:** [MatrixOutput](abstractions.md#matrixoutput) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### heatOutput + +Matrix-like output for heat maps. + +* **file:** output/heat.cpp +* **inherits:** [MatrixOutput](abstractions.md#matrixoutput) +* **author:** Scott Klum +* **properties:** None + +--- + +#### histOutput + +Score histogram. + +* **file:** output/hist.cpp +* **inherits:** [Output](abstractions.md#output) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### meltOutput + +One score per row. + +* **file:** output/melt.cpp +* **inherits:** [MatrixOutput](abstractions.md#matrixoutput) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### mtxOutput + + + +* **file:** output/mtx.cpp +* **inherits:** [Output](abstractions.md#output) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### nullOutput + +Discards the scores. + +* **file:** output/null.cpp +* **inherits:** [Output](abstractions.md#output) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### rankOutput + +Outputs highest ranked matches with scores. + +* **file:** output/rank.cpp +* **inherits:** [MatrixOutput](abstractions.md#matrixoutput) +* **author:** Scott Klum +* **properties:** None + +--- + +#### rrOutput + +Rank retrieval output. + +* **file:** output/rr.cpp +* **inherits:** [MatrixOutput](abstractions.md#matrixoutput) +* **authors:** Josh Klontz, Scott Klum +* **properties:** None + +--- + +#### tailOutput + +The highest scoring matches. + +* **file:** output/tail.cpp +* **inherits:** [Output](abstractions.md#output) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### txtOutput + +Text file output. + +* **file:** output/txt.cpp +* **inherits:** [MatrixOutput](abstractions.md#matrixoutput) +* **author:** Josh Klontz +* **properties:** None + +## Video + +--- + +#### AggregateFrames + +Passes along n sequential frames to the next transform. + +* **file:** video/aggregate.cpp +* **inherits:** [TimeVaryingTransform](abstractions.md#timevaryingtransform) +* **author:** Josh Klontz +* **properties:** None + +--- + +#### DropFrames + +Only use one frame every n frames. + +* **file:** video/drop.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Austin Blanton +* **properties:** None + +--- + +#### OpticalFlowTransform + +Gets a one-channel dense optical flow from two images + +* **file:** video/opticalflow.cpp +* **inherits:** [UntrainableMetaTransform](abstractions.md#untrainablemetatransform) +* **author:** Austin Blanton +* **properties:** None + diff --git a/docs/docs/technical.md b/docs/docs/technical.md new file mode 100644 index 0000000..538cd65 --- /dev/null +++ b/docs/docs/technical.md @@ -0,0 +1,80 @@ +# Technical Overview of the OpenBR System + +--- + +## Algorithms in OpenBR + +**So you've run `scripts/helloWorld.sh` and it generally makes sense, except you have no idea what `'Open+Cvt(Gray)+Cascade(FrontalFace)+ASEFEyes+Affine(128,128,0.33,0.45)+CvtFloat+PCA(0.95):Dist(L2)'` means or how it is executed.** + +Well if this is the case, you've found the right documentation. +Let's get started! + +In OpenBR an *algorithm* is a technique for enrolling templates associated with a technique for comparing them. +Recall that our ultimate goal is to be able to say how similar two face images are (or two fingerprints, irises, etc.). +Instead of storing the entire raw image for comparison, it is common practice to store an optimized representation, or *template*, of the image for the task at hand. +The process of generating this optimized representation is called *template enrollment* or *template generation*. +Given two templates, *template comparison* computes the similarity between them, where the higher values indicate more probable matches and the threshold for determining what constitutes an adequate match is determined operationally. +The goal of template generation is to design templates that are small, accurate, and fast to compare. +Ok, you probably knew all of this already, let's move on. + +The only way of creating an algorithm in OpenBR is from a text string that describes it. +We call this string the *algorithm description*. +The algorithm description is separated into two parts by a ':', with the left hand side indicating how to generate templates and the right hand side indicating how to compare them. +Some algorithms, like [age_estimation](tutorials.md#age estimation) and [gender estimation](tutorials.md#gender estimation) are *classifiers* that don't create templates. +In these cases, the colon and the template comparison technique can be omitted from the algorithm description. + +There are several motivations for mandating that algorithms are defined from these strings, here are the most important: + 1. It ensures good software development practices by forcibly decoupling the development of each step in an algorithm, facilitating the modification of algorithms and the re-use of individual steps. + 2. It spares the creation and maintenance of a lot of very similar header files that would otherwise be needed for each step in an algorithm, observe the absence of headers in `openbr/plugins`. + 3. It allows for algorithm parameter tuning without recompiling. + 4. It is completely unambiguous, both the OpenBR interpreter and anyone familiar with the project can understand exactly what your algorithm does just from this description. + +Let's look at some of the important parts of the code base that make this possible! + +In `AlgorithmCore::init()` in `openbr/core/core.cpp` you can see the code for splitting the algorithm description at the colon. +Shortly thereafter in this function we *make* the template generation and comparison methods. +These make calls are defined in the public [C++ plugin API](#the c++ plugin api) and can also be called from end user code. + +Below we discuss some of the source code for `Transform::make` in `openbr/openbr_plugin.cpp`. +Note, the make functions for other plugin types are similar in spirit and will not be covered. + +One of the first steps when converting the template enrollment description into a [Transform](abstractions.md#Transform) is to replace the operators, like '+', with their full form: + + { // Check for use of '+' as shorthand for Pipe(...) + QStringList words = parse(str, '+'); + if (words.size() > 1) + return make("Pipe([" + words.join(",") + "])", parent); + } + +A pipe (see [PipeTransform](plugins.md#pipetransform)) is the standard way of chaining together multiple steps in series to form more sophisticated algorithms. +PipeTransform takes a list of transforms, and projects templates through each transform in order. + +After operator expansion, the template enrollment description forms a tree, and the transform is constructed from this description starting recursively starting at the root of the tree: + + Transform *transform = Factory::make("." + str); + +At this point we reach arguably the most important code in the entire framework, the *object factory* in `openbr/openbr_plugin.h`. +The [Factory](abstractions.md#factory) class is responsible for constructing an object from a string: + + static T *make(const File &file) + { + QString name = file.get("plugin", ""); + if (name.isEmpty()) name = file.suffix(); + if (!names().contains(name)) { + if (names().contains("Empty") && name.isEmpty()) name = "Empty"; + else if (names().contains("Default")) name = "Default"; + else qFatal("%s registry does not contain object named: %s", qPrintable(baseClassName()), qPrintable(name)); + } + T *object = registry->value(name)->_make(); + static_cast(object)->init(file); + return object; + } + +Going back to our original example, a [PipeTransform](plugins.md#pipetransform) will be created with [OpenTransform](plugins.md#opentransform), [CvtTransform](plugins.md#cvttransform), [CascadeTransform](plugins.md#cascadetransform), [ASEFEyesTransform](plugins.md#asefeyestransform), [AffineTransform](plugins.md#affinetransform), [CvtFloatTransform](plugins.md#cvtfloattransform), and [PCATransform](plugins.md#pcatransform) as its children. + +If you want all the tedious details about what exactly this algoritm does, then you should read the [project](abstractions.md#transform#project) function implemented by each of these plugins. +The brief explanation is that it *reads the image from disk, converts it to grayscale, runs the face detector, runs the eye detector on any detected faces, uses the eye locations to normalize the face for rotation and scale, converts to floating point format, and then embeds it in a PCA subspaced trained on face images*. +If you are familiar with face recognition, you will likely recognize this as the Eigenfaces \cite turk1991eigenfaces algorithm. + +As a final note, the Eigenfaces algorithms uses the Euclidean distance (or L2-norm) to compare templates. +Since OpenBR expects *similarity* values when comparing templates, and not *distances*, the [DistDistance](plugins.md#distdistance) will return *-log(distance+1)* so that larger values indicate more similarity. diff --git a/docs/docs/tutorials.md b/docs/docs/tutorials.md new file mode 100644 index 0000000..6090b59 --- /dev/null +++ b/docs/docs/tutorials.md @@ -0,0 +1,27 @@ +# Tutorials + +Learn OpenBR! + +--- + +Welcome to OpenBR! Here we have a series of tutorials designed to get you up to speed on what OpenBR is, how it works, its command line interface, and the C API. These tutorials aren't meant to be completed in a specific order so feel free to hop around. If you need help, feel free to [contact us](index.md#help). + +--- + +## OpenBR in 10 minutes or less! + +This tutorial is meant to familiarize you with the ideas, objects and motivations behind OpenBR. If all you want to do is use some OpenBR applications or API calls the next tutorials might be more relevant to you. + +OpenBR is a C++ library built on top of QT and OpenCV. It was built primarily as a platform for [face recognition](#face recognition) but has grown to do other things like [age recognition](#age recognition) and [gender recognition](#gender recognition). The different functionalities of OpenBR are specified by algorithms which are passed in as strings. The algorithm to do face recognition is + + $ Open+Cvt(Gray)+Cascade(FrontalFace)+ASEFEyes+Affine(88,88,0.25,0.35)++++SetMetadata(AlgorithmID,-1):Unit(ByteL1) + +Woah, that's a lot! Face recognition is a pretty complicated process! We will break this whole string down in just a second, but first we can showcase one of the founding principles of OpenBR. In the face recognition algorithm there are a series of steps separated by +'s (and a few other symbols but they will all be explained); these steps are called plugins and they are the building blocks of all OpenBR algorithms. Each plugin is completely independent of all of the other plugins around it and each one can be swapped, inserted or removed at any time to form new algorithms. This makes it really easy to test new ideas as you come up with them! + +So, now lets talk about the basics of algorithms in OpenBR. We know that algorithms are just a series of plugins joined together using the + symbol. What about the : symbol right at the end of the algorithm however? :'s separate the processing part of the algorithm (also called enrollment or generation), from the evaluation part. OpenBR actually has different types of plugins to handle each part. Plugins to the left are called [transforms](abstractions.md#transform) and plugins to the right are called [distances](abstractions.md#distance). Transforms operate on the images as they pass through the algorithm and distances compare (or find the distance between) the images as they finish, usually constructing a similarity matrix in the process. + +This leads us on a small tangent to discuss how images are handled in OpenBR. OpenBR has two structures dedicated to handling data as it passes through an algorithm, [Files](abstractions.md#file) and [Templates](abstractions.md#template). Files handle metadata, the text and other information that can be associated with an image, and templates act as a container for images (we use OpenCV mats) and files. These templates are passed from transform to transform through the algorithm and are *transformed* (see, the name makes sense!) as they go. + +Great, you now know how data is handled in OpenBR but we still have a lot to cover in that algorithm string! Next lets talk about all of the parentheses next to each plugin. Many plugins have parameters that can be set at runtime. For example, [Cvt](plugins.md#cvttransform) (short for convert) changes the colorspace of an image. For face recognition we want to change it to gray so we pass in Gray as the parameter to Cvt. Pretty simple right? Parameters can either be passed in in the order they appear in the code, or they can use a key-value pairing. Cvt(Gray) is equivalent to Cvt(ColorSpace=Gray), check out the docs for the properties of each plugin. + +The last symbol we need to cover is <>. In OpenBR <> represents i/o. Transforms within these brackets will try and load their parameters from the hard drive if they can (they also still take parameters from the command line as you can see). Plugin i/o won't be covered here because it isn't critically important to making OpenBR work for you out of the gate. Stay tuned for a later tutorial on this. diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml new file mode 100644 index 0000000..3f0d02c --- /dev/null +++ b/docs/mkdocs.yml @@ -0,0 +1,9 @@ +site_name: OpenBR +pages: +- [index.md, Home] +- [install.md, Install] +- [tutorials.md, Tutorials] +- [technical.md, Technical Overview] +- [abstractions.md, Docs, Abstractions] +- [plugins.md, Docs, Plugins] +theme: flatly diff --git a/docs/scripts/generate_docs.py b/docs/scripts/generate_docs.py new file mode 100644 index 0000000..537afd9 --- /dev/null +++ b/docs/scripts/generate_docs.py @@ -0,0 +1,90 @@ +import os +import re + +def subfiles(path): + return [name for name in os.listdir(path) if os.path.isfile(os.path.join(path, name)) and not name[0] == '.'] + +def subdirs(path): + return [name for name in os.listdir(path) if os.path.isdir(os.path.join(path, name))] + +def parse(group): + docs = re.compile('/\*\!(.*?)\*/', re.DOTALL) + + docsMatch = docs.match(group) + clss = group[docsMatch.end():].strip() + if len(clss) == 0 or 'class' not in clss: + return None + + blocks = docsMatch.group().split('\\')[1:] + if len(blocks) == 0: + return None + + attributes = {} + for block in blocks: + key = block[:block.find(' ')] + value = block[block.find(' '):].split('\n')[0].strip() + if key in attributes: + attributes[key].append(value) + else: + attributes[key] = [value] + + attributes['Name'] = clss[5:clss.find(':')].strip() + attributes['Parent'] = clss[clss.find('public')+6:].strip() + return attributes + +def parseProperties(properties): + output = "" + for prop in properties: + split = prop.find(' ') + name = prop[:split] + desc = prop[split:] + + output += "\t* **" + name + "**- " + desc + "\n" + return output + +def main(): + plugins_dir = '../../openbr/plugins/' + output_file = open('../docs/plugins.md', 'w+') + + output_file.write("# Plugins\n\n" + + "A description of all of the plugins available in OpenBR, broken down" + + " by module. This section assumes knowledge of the [C++ Plugin API](technical.md#c++ plugin api)" + + " and the [plugin abstractions](abstractions.md).\n\n") + + for module in subdirs(plugins_dir): + if module == "cmake": + continue + + output_file.write("## " + module.capitalize() + "\n\n") + for plugin in subfiles(os.path.join(plugins_dir, module)): + f = open(os.path.join(os.path.join(plugins_dir, module), plugin), 'r') + content = f.read() + + regex = re.compile('/\*\!(.*?)\*/\n(.*?)\n', re.DOTALL) + it = regex.finditer(content) + for match in it: + attributes = parse(match.group()) + if not attributes: + continue + + output_file.write("---\n\n") + output_file.write("#### " + attributes["Name"] + "\n\n") + output_file.write(attributes["brief"][0] + "\n\n") + output_file.write("* **file:** " + os.path.join(module, plugin) + "\n") + output_file.write("* **inherits:** [" + attributes["Parent"] + "](abstractions.md#" + attributes["Parent"].lower() + ")\n") + + authors = attributes["author"] + if len(authors) > 1: + output_file.write("* **authors:** " + ", ".join(attributes["author"]) + "\n") + else: + output_file.write("* **author:** " + attributes["author"][0] + "\n") + + if not 'property' in attributes.keys(): + output_file.write("* **properties:** None\n") + else: + properties = attributes['property'] + output_file.write("* **properties:**\n\n") + output_file.write(parseProperties(properties) + "\n") + + output_file.write("\n") +main() diff --git a/docs/site/404.html b/docs/site/404.html new file mode 100644 index 0000000..3b9fe5c --- /dev/null +++ b/docs/site/404.html @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + My Docs + + + + + + + + + + + + + + + + + 404 + Page not found + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/site/css/base.css b/docs/site/css/base.css new file mode 100644 index 0000000..f73f308 --- /dev/null +++ b/docs/site/css/base.css @@ -0,0 +1,169 @@ +body { + padding-top: 70px; + background: url(../img/grid.png) repeat-x; + background-attachment: fixed; + background-color: #f8f8f8; +} + +body > div.container { + min-height: 400px; +} + +ul.nav li.main { + font-weight: bold; +} + +div.col-md-3 { + padding-left: 0; +} + +div.source-links { + float: right; +} + +div.col-md-9 img { + max-width: 100%; + display: block; + padding: 4px; + line-height: 1.428571429; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + margin: 20px auto 30px auto; +} + +h1, h2, h3 { + color: #444; +} + +h1 { + font-weight: 400; + font-size: 42px; +} + +h2, h3, h4, h5, h6 { + font-weight: 300; +} + +hr { + border-top: 1px solid #aaa; +} + +pre, .rst-content tt { + max-width: 100%; + background: #fff; + border: solid 1px #e1e4e5; + color: #e74c3c; + overflow-x: auto; +} + +code.code-large, .rst-content tt.code-large { + font-size: 90%; +} + +code { + padding: 2px 5px; + color: #c7254e; + background-color: #f9f2f4; + font-size: 75%; +} + +code, kbd, pre, samp { + font-family: monospace,serif; + font-size: 12px !important; +} + +footer { + margin-top: 30px; + margin-bottom: 10px; + text-align: center; + font-weight: 200; +} + +.modal-dialog { + margin-top: 60px; +} + +/* + * Side navigation + * + * Scrollspy and affixed enhanced navigation to highlight sections and secondary + * sections of docs content. + */ + +/* By default it's not affixed in mobile views, so undo that */ +.bs-sidebar.affix { + position: static; +} + +.bs-sidebar.well { + padding: 0; +} + +/* First level of nav */ +.bs-sidenav { + padding-top: 10px; + padding-bottom: 10px; + border-radius: 5px; +} + +/* All levels of nav */ +.bs-sidebar .nav > li > a { + display: block; + padding: 5px 20px; +} +.bs-sidebar .nav > li > a:hover, +.bs-sidebar .nav > li > a:focus { + text-decoration: none; + border-right: 1px solid; +} +.bs-sidebar .nav > .active > a, +.bs-sidebar .nav > .active:hover > a, +.bs-sidebar .nav > .active:focus > a { + font-weight: bold; + background-color: transparent; + border-right: 1px solid; +} + +/* Nav: second level (shown on .active) */ +.bs-sidebar .nav .nav { + display: none; /* Hide by default, but at >768px, show it */ + margin-bottom: 8px; +} +.bs-sidebar .nav .nav > li > a { + padding-top: 3px; + padding-bottom: 3px; + padding-left: 30px; + font-size: 90%; +} + +/* Show and affix the side nav when space allows it */ +@media (min-width: 992px) { + .bs-sidebar .nav > .active > ul { + display: block; + } + /* Widen the fixed sidebar */ + .bs-sidebar.affix, + .bs-sidebar.affix-bottom { + width: 213px; + } + .bs-sidebar.affix { + position: fixed; /* Undo the static from mobile first approach */ + top: 80px; + } + .bs-sidebar.affix-bottom { + position: absolute; /* Undo the static from mobile first approach */ + } + .bs-sidebar.affix-bottom .bs-sidenav, + .bs-sidebar.affix .bs-sidenav { + margin-top: 0; + margin-bottom: 0; + } +} +@media (min-width: 1200px) { + /* Widen the fixed sidebar again */ + .bs-sidebar.affix-bottom, + .bs-sidebar.affix { + width: 263px; + } +} \ No newline at end of file diff --git a/docs/site/css/bootstrap-custom.min.css b/docs/site/css/bootstrap-custom.min.css new file mode 100644 index 0000000..d85b1dc --- /dev/null +++ b/docs/site/css/bootstrap-custom.min.css @@ -0,0 +1 @@ +/*! normalize.css v2.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a{background:transparent}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{margin:.67em 0;font-size:2em}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid #c0c0c0}legend{padding:0;border:0}button,input,select,textarea{margin:0;font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{padding:0;box-sizing:border-box}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:2cm .5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#555;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#2fa4e7;text-decoration:none}a:hover,a:focus{color:#157ab5;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}img{vertical-align:middle}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:#317eac}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{margin-top:20px;margin-bottom:10px}h1 small,h2 small,h3 small,h1 .small,h2 .small,h3 .small{font-size:65%}h4,h5,h6{margin-top:10px;margin-bottom:10px}h4 small,h5 small,h6 small,h4 .small,h5 .small,h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media(min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-muted{color:#999}.text-primary{color:#2fa4e7}.text-primary:hover{color:#178acc}.text-warning{color:#c09853}.text-warning:hover{color:#a47e3c}.text-danger{color:#b94a48}.text-danger:hover{color:#953b39}.text-success{color:#468847}.text-success:hover{color:#356635}.text-info{color:#3a87ad}.text-info:hover{color:#2d6987}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.list-inline>li:first-child{padding-left:0}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.428571429}dt{font-weight:bold}dd{margin-left:0}@media(min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small,blockquote .small{display:block;line-height:1.428571429;color:#999}blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small,blockquote.pull-right .small{text-align:right}blockquote.pull-right small:before,blockquote.pull-right .small:before{content:''}blockquote.pull-right small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.428571429}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}@media(min-width:768px){.container{width:750px}}@media(min-width:992px){.container{width:970px}}@media(min-width:1200px){.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666666666666%}.col-xs-10{width:83.33333333333334%}.col-xs-9{width:75%}.col-xs-8{width:66.66666666666666%}.col-xs-7{width:58.333333333333336%}.col-xs-6{width:50%}.col-xs-5{width:41.66666666666667%}.col-xs-4{width:33.33333333333333%}.col-xs-3{width:25%}.col-xs-2{width:16.666666666666664%}.col-xs-1{width:8.333333333333332%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666666666666%}.col-xs-pull-10{right:83.33333333333334%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666666666666%}.col-xs-pull-7{right:58.333333333333336%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666666666667%}.col-xs-pull-4{right:33.33333333333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.666666666666664%}.col-xs-pull-1{right:8.333333333333332%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666666666666%}.col-xs-push-10{left:83.33333333333334%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666666666666%}.col-xs-push-7{left:58.333333333333336%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666666666667%}.col-xs-push-4{left:33.33333333333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.666666666666664%}.col-xs-push-1{left:8.333333333333332%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666666666666%}.col-xs-offset-10{margin-left:83.33333333333334%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666666666666%}.col-xs-offset-7{margin-left:58.333333333333336%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666666666667%}.col-xs-offset-4{margin-left:33.33333333333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.666666666666664%}.col-xs-offset-1{margin-left:8.333333333333332%}.col-xs-offset-0{margin-left:0}@media(min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666666666666%}.col-sm-10{width:83.33333333333334%}.col-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-0{margin-left:0}}@media(min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{width:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-0{margin-left:0}}@media(min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;display:table-column;float:none}table td[class*="col-"],table th[class*="col-"]{display:table-cell;float:none}.table>thead>tr>.active,.table>tbody>tr>.active,.table>tfoot>tr>.active,.table>thead>.active>td,.table>tbody>.active>td,.table>tfoot>.active>td,.table>thead>.active>th,.table>tbody>.active>th,.table>tfoot>.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>.active:hover,.table-hover>tbody>.active:hover>td,.table-hover>tbody>.active:hover>th{background-color:#e8e8e8}.table>thead>tr>.success,.table>tbody>tr>.success,.table>tfoot>tr>.success,.table>thead>.success>td,.table>tbody>.success>td,.table>tfoot>.success>td,.table>thead>.success>th,.table>tbody>.success>th,.table>tfoot>.success>th{background-color:#dff0d8}.table-hover>tbody>tr>.success:hover,.table-hover>tbody>.success:hover>td,.table-hover>tbody>.success:hover>th{background-color:#d0e9c6}.table>thead>tr>.danger,.table>tbody>tr>.danger,.table>tfoot>tr>.danger,.table>thead>.danger>td,.table>tbody>.danger>td,.table>tfoot>.danger>td,.table>thead>.danger>th,.table>tbody>.danger>th,.table>tfoot>.danger>th{background-color:#f2dede}.table-hover>tbody>tr>.danger:hover,.table-hover>tbody>.danger:hover>td,.table-hover>tbody>.danger:hover>th{background-color:#ebcccc}.table>thead>tr>.warning,.table>tbody>tr>.warning,.table>tfoot>tr>.warning,.table>thead>.warning>td,.table>tbody>.warning>td,.table>tfoot>.warning>td,.table>thead>.warning>th,.table>tbody>.warning>th,.table>tfoot>.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>.warning:hover,.table-hover>tbody>.warning:hover>td,.table-hover>tbody>.warning:hover>th{background-color:#faf2cc}@media(max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#555;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}input[type="number"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{height:auto}output{display:block;padding-top:9px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle}.form-control{display:block;width:100%;height:38px;padding:8px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.radio label,.checkbox label{display:inline;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:normal;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm{height:auto}.input-lg{height:54px;padding:14px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:54px;line-height:54px}textarea.input-lg{height:auto}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#c09853}.has-warning .form-control{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.has-warning .input-group-addon{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#b94a48}.has-error .form-control{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.has-error .input-group-addon{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#468847}.has-success .form-control{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.has-success .input-group-addon{color:#468847;background-color:#dff0d8;border-color:#468847}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#959595}@media(min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline select.form-control{width:auto}.form-inline .radio,.form-inline .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:none;margin-left:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:9px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:29px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-control-static{padding-top:9px}@media(min-width:768px){.form-horizontal .control-label{text-align:right}}.btn{display:inline-block;padding:8px 12px;margin-bottom:0;font-size:14px;font-weight:normal;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#555;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#555;background-color:#fff;border-color:rgba(0,0,0,0.1)}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#555;background-color:#ebebeb;border-color:rgba(0,0,0,0.1)}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:rgba(0,0,0,0.1)}.btn-default .badge{color:#fff;background-color:#fff}.btn-primary{color:#fff;background-color:#2fa4e7;border-color:#2fa4e7}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#1990d5;border-color:#1684c2}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#2fa4e7;border-color:#2fa4e7}.btn-primary .badge{color:#2fa4e7;background-color:#fff}.btn-warning{color:#fff;background-color:#dd5600;border-color:#dd5600}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#b44600;border-color:#a03e00}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#dd5600;border-color:#dd5600}.btn-warning .badge{color:#dd5600;background-color:#fff}.btn-danger{color:#fff;background-color:#c71c22;border-color:#c71c22}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#a3171c;border-color:#911419}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#c71c22;border-color:#c71c22}.btn-danger .badge{color:#c71c22;background-color:#fff}.btn-success{color:#fff;background-color:#73a839;border-color:#73a839}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#5e8a2f;border-color:#547a29}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#73a839;border-color:#73a839}.btn-success .badge{color:#73a839;background-color:#fff}.btn-info{color:#fff;background-color:#033c73;border-color:#033c73}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#02274b;border-color:#011d37}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#033c73;border-color:#033c73}.btn-info .badge{color:#033c73;background-color:#fff}.btn-link{font-weight:normal;color:#2fa4e7;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#157ab5;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg{padding:14px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:normal;line-height:1;-moz-osx-font-smoothing:grayscale}.glyphicon:empty{width:1em}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.428571429;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#fff;text-decoration:none;background-color:#2fa4e7}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#2fa4e7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media(min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar .btn-group{float:left}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-lg>.btn{padding:14px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child>.btn:last-child,.btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-right:0;padding-left:0}.input-group .form-control{width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:54px;padding:14px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:54px;line-height:54px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:8px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:14px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;white-space:nowrap}.input-group-btn:first-child>.btn{margin-right:-1px}.input-group-btn:last-child>.btn{margin-left:-1px}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-4px}.input-group-btn>.btn:hover,.input-group-btn>.btn:active{z-index:2}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#2fa4e7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#2fa4e7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}@media(min-width:768px){.navbar{border-radius:4px}}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}@media(min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media(min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.container>.navbar-header,.container>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media(min-width:768px){.container>.navbar-header,.container>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media(min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media(min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media(min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media(min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media(max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media(min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media(min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:6px;margin-right:-15px;margin-bottom:6px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}@media(min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form select.form-control{width:auto}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}}@media(max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media(min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-nav.pull-right>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar-btn{margin-top:6px;margin-bottom:6px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media(min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#2fa4e7;border-color:#1995dc}.navbar-default .navbar-brand{color:#fff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#fff;background-color:none}.navbar-default .navbar-text{color:#ddd}.navbar-default .navbar-nav>li>a{color:#fff}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#fff;background-color:#178acc}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#fff;background-color:#178acc}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ddd;background-color:transparent}.navbar-default .navbar-toggle{border-color:#178acc}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#178acc}.navbar-default .navbar-toggle .icon-bar{background-color:#fff}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#1995dc}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#fff;background-color:#178acc}@media(max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#fff}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:#178acc}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#178acc}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ddd;background-color:transparent}}.navbar-default .navbar-link{color:#fff}.navbar-default .navbar-link:hover{color:#fff}.navbar-inverse{background-color:#033c73;border-color:#022f5a}.navbar-inverse .navbar-brand{color:#fff}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:none}.navbar-inverse .navbar-text{color:#fff}.navbar-inverse .navbar-nav>li>a{color:#fff}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:#022f5a}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#022f5a}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#022f5a}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#022f5a}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#022a50}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#022f5a}@media(max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#022f5a}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#022f5a}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#fff}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:#022f5a}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#022f5a}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-inverse .navbar-link{color:#fff}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:8px 12px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{background-color:#eee}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#999;cursor:default;background-color:#f5f5f5;border-color:#f5f5f5}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:14px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#2fa4e7}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#178acc}.label-success{background-color:#73a839}.label-success[href]:hover,.label-success[href]:focus{background-color:#59822c}.label-info{background-color:#033c73}.label-info[href]:hover,.label-info[href]:focus{background-color:#022241}.label-warning{background-color:#dd5600}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#aa4200}.label-danger{background-color:#c71c22}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#9a161a}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#2fa4e7;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{line-height:1;color:inherit}.jumbotron p{line-height:1.4}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:block;height:auto;max-width:100%;margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#2fa4e7}.thumbnail .caption{padding:9px;color:#555}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#356635}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#2d6987}.alert-warning{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5}.alert-warning hr{border-top-color:#f8e5be}.alert-warning .alert-link{color:#a47e3c}.alert-danger{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger hr{border-top-color:#e6c1c7}.alert-danger .alert-link{color:#953b39}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#2fa4e7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#73a839}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#033c73}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#dd5600}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#c71c22}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#2fa4e7;border-color:#2fa4e7}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e6f4fc}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0}.panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child th,.panel>.table>tbody:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:last-child>th,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:last-child>td,.panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#555;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#ddd}.panel-primary>.panel-heading{color:#fff;background-color:#2fa4e7;border-color:#ddd}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-success{border-color:#ddd}.panel-success>.panel-heading{color:#468847;background-color:#73a839;border-color:#ddd}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-warning{border-color:#ddd}.panel-warning>.panel-heading{color:#c09853;background-color:#dd5600;border-color:#ddd}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-danger{border-color:#ddd}.panel-danger>.panel-heading{color:#b94a48;background-color:#c71c22;border-color:#ddd}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-info{border-color:#ddd}.panel-info>.panel-heading{color:#3a87ad;background-color:#033c73;border-color:#ddd}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;z-index:1050;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.428571429}.modal-body{position:relative;padding:20px}.modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}}.tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:rgba(0,0,0,0.9);border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:rgba(0,0,0,0.9);border-width:5px 5px 0}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:rgba(0,0,0,0.9);border-width:5px 5px 0}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:rgba(0,0,0,0.9);border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:rgba(0,0,0,0.9);border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:rgba(0,0,0,0.9);border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:rgba(0,0,0,0.9);border-width:0 5px 5px}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:rgba(0,0,0,0.9);border-width:0 5px 5px}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:rgba(0,0,0,0.9);border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;height:auto;max-width:100%;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);opacity:.5;filter:alpha(opacity=50)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.5) 0),color-stop(rgba(0,0,0,0.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1)}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.0001) 0),color-stop(rgba(0,0,0,0.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1)}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;outline:0;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicons-chevron-left,.carousel-control .glyphicons-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix:after{clear:both}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,tr.visible-xs,th.visible-xs,td.visible-xs{display:none!important}@media(max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block!important}table.visible-xs.visible-sm{display:table}tr.visible-xs.visible-sm{display:table-row!important}th.visible-xs.visible-sm,td.visible-xs.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-xs.visible-md{display:block!important}table.visible-xs.visible-md{display:table}tr.visible-xs.visible-md{display:table-row!important}th.visible-xs.visible-md,td.visible-xs.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-xs.visible-lg{display:block!important}table.visible-xs.visible-lg{display:table}tr.visible-xs.visible-lg{display:table-row!important}th.visible-xs.visible-lg,td.visible-xs.visible-lg{display:table-cell!important}}.visible-sm,tr.visible-sm,th.visible-sm,td.visible-sm{display:none!important}@media(max-width:767px){.visible-sm.visible-xs{display:block!important}table.visible-sm.visible-xs{display:table}tr.visible-sm.visible-xs{display:table-row!important}th.visible-sm.visible-xs,td.visible-sm.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-sm.visible-md{display:block!important}table.visible-sm.visible-md{display:table}tr.visible-sm.visible-md{display:table-row!important}th.visible-sm.visible-md,td.visible-sm.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-sm.visible-lg{display:block!important}table.visible-sm.visible-lg{display:table}tr.visible-sm.visible-lg{display:table-row!important}th.visible-sm.visible-lg,td.visible-sm.visible-lg{display:table-cell!important}}.visible-md,tr.visible-md,th.visible-md,td.visible-md{display:none!important}@media(max-width:767px){.visible-md.visible-xs{display:block!important}table.visible-md.visible-xs{display:table}tr.visible-md.visible-xs{display:table-row!important}th.visible-md.visible-xs,td.visible-md.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block!important}table.visible-md.visible-sm{display:table}tr.visible-md.visible-sm{display:table-row!important}th.visible-md.visible-sm,td.visible-md.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-md.visible-lg{display:block!important}table.visible-md.visible-lg{display:table}tr.visible-md.visible-lg{display:table-row!important}th.visible-md.visible-lg,td.visible-md.visible-lg{display:table-cell!important}}.visible-lg,tr.visible-lg,th.visible-lg,td.visible-lg{display:none!important}@media(max-width:767px){.visible-lg.visible-xs{display:block!important}table.visible-lg.visible-xs{display:table}tr.visible-lg.visible-xs{display:table-row!important}th.visible-lg.visible-xs,td.visible-lg.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block!important}table.visible-lg.visible-sm{display:table}tr.visible-lg.visible-sm{display:table-row!important}th.visible-lg.visible-sm,td.visible-lg.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-lg.visible-md{display:block!important}table.visible-lg.visible-md{display:table}tr.visible-lg.visible-md{display:table-row!important}th.visible-lg.visible-md,td.visible-lg.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}.hidden-xs{display:block!important}table.hidden-xs{display:table}tr.hidden-xs{display:table-row!important}th.hidden-xs,td.hidden-xs{display:table-cell!important}@media(max-width:767px){.hidden-xs,tr.hidden-xs,th.hidden-xs,td.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm,tr.hidden-xs.hidden-sm,th.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-xs.hidden-md,tr.hidden-xs.hidden-md,th.hidden-xs.hidden-md,td.hidden-xs.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-xs.hidden-lg,tr.hidden-xs.hidden-lg,th.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg{display:none!important}}.hidden-sm{display:block!important}table.hidden-sm{display:table}tr.hidden-sm{display:table-row!important}th.hidden-sm,td.hidden-sm{display:table-cell!important}@media(max-width:767px){.hidden-sm.hidden-xs,tr.hidden-sm.hidden-xs,th.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-sm,tr.hidden-sm,th.hidden-sm,td.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-sm.hidden-md,tr.hidden-sm.hidden-md,th.hidden-sm.hidden-md,td.hidden-sm.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-sm.hidden-lg,tr.hidden-sm.hidden-lg,th.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg{display:none!important}}.hidden-md{display:block!important}table.hidden-md{display:table}tr.hidden-md{display:table-row!important}th.hidden-md,td.hidden-md{display:table-cell!important}@media(max-width:767px){.hidden-md.hidden-xs,tr.hidden-md.hidden-xs,th.hidden-md.hidden-xs,td.hidden-md.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-md.hidden-sm,tr.hidden-md.hidden-sm,th.hidden-md.hidden-sm,td.hidden-md.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-md,tr.hidden-md,th.hidden-md,td.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-md.hidden-lg,tr.hidden-md.hidden-lg,th.hidden-md.hidden-lg,td.hidden-md.hidden-lg{display:none!important}}.hidden-lg{display:block!important}table.hidden-lg{display:table}tr.hidden-lg{display:table-row!important}th.hidden-lg,td.hidden-lg{display:table-cell!important}@media(max-width:767px){.hidden-lg.hidden-xs,tr.hidden-lg.hidden-xs,th.hidden-lg.hidden-xs,td.hidden-lg.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-lg.hidden-sm,tr.hidden-lg.hidden-sm,th.hidden-lg.hidden-sm,td.hidden-lg.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-lg.hidden-md,tr.hidden-lg.hidden-md,th.hidden-lg.hidden-md,td.hidden-lg.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-lg,tr.hidden-lg,th.hidden-lg,td.hidden-lg{display:none!important}}.visible-print,tr.visible-print,th.visible-print,td.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}.hidden-print,tr.hidden-print,th.hidden-print,td.hidden-print{display:none!important}}.navbar{background-image:-webkit-linear-gradient(#54b4eb,#2fa4e7 60%,#1d9ce5);background-image:linear-gradient(#54b4eb,#2fa4e7 60%,#1d9ce5);background-repeat:no-repeat;border-bottom:1px solid #178acc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff54b4eb',endColorstr='#ff1d9ce5',GradientType=0);filter:none;-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar .navbar-nav>li>a,.navbar-brand{text-shadow:0 1px 0 rgba(0,0,0,0.1)}.navbar-inverse{background-image:-webkit-linear-gradient(#04519b,#044687 60%,#033769);background-image:linear-gradient(#04519b,#044687 60%,#033769);background-repeat:no-repeat;border-bottom:1px solid #022241;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff04519b',endColorstr='#ff033769',GradientType=0);filter:none}.btn{text-shadow:0 1px 0 rgba(0,0,0,0.1)}.btn .caret{border-top-color:#fff}.btn-default{background-image:-webkit-linear-gradient(#fff,#fff 60%,#f5f5f5);background-image:linear-gradient(#fff,#fff 60%,#f5f5f5);background-repeat:no-repeat;border-bottom:1px solid #e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff5f5f5',GradientType=0);filter:none}.btn-default:hover{color:#555}.btn-default .caret{border-top-color:#555}.btn-default{background-image:-webkit-linear-gradient(#fff,#fff 60%,#f5f5f5);background-image:linear-gradient(#fff,#fff 60%,#f5f5f5);background-repeat:no-repeat;border-bottom:1px solid #e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff5f5f5',GradientType=0);filter:none}.btn-primary{background-image:-webkit-linear-gradient(#54b4eb,#2fa4e7 60%,#1d9ce5);background-image:linear-gradient(#54b4eb,#2fa4e7 60%,#1d9ce5);background-repeat:no-repeat;border-bottom:1px solid #178acc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff54b4eb',endColorstr='#ff1d9ce5',GradientType=0);filter:none}.btn-success{background-image:-webkit-linear-gradient(#88c149,#73a839 60%,#699934);background-image:linear-gradient(#88c149,#73a839 60%,#699934);background-repeat:no-repeat;border-bottom:1px solid #59822c;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff88c149',endColorstr='#ff699934',GradientType=0);filter:none}.btn-info{background-image:-webkit-linear-gradient(#04519b,#033c73 60%,#02325f);background-image:linear-gradient(#04519b,#033c73 60%,#02325f);background-repeat:no-repeat;border-bottom:1px solid #022241;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff04519b',endColorstr='#ff02325f',GradientType=0);filter:none}.btn-warning{background-image:-webkit-linear-gradient(#ff6707,#dd5600 60%,#c94e00);background-image:linear-gradient(#ff6707,#dd5600 60%,#c94e00);background-repeat:no-repeat;border-bottom:1px solid #aa4200;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff6707',endColorstr='#ffc94e00',GradientType=0);filter:none}.btn-danger{background-image:-webkit-linear-gradient(#e12b31,#c71c22 60%,#b5191f);background-image:linear-gradient(#e12b31,#c71c22 60%,#b5191f);background-repeat:no-repeat;border-bottom:1px solid #9a161a;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe12b31',endColorstr='#ffb5191f',GradientType=0);filter:none}.pagination .active>a,.pagination .active>a:hover{border-color:#ddd}.panel-primary .panel-heading,.panel-success .panel-heading,.panel-warning .panel-heading,.panel-danger .panel-heading,.panel-info .panel-heading,.panel-primary .panel-title,.panel-success .panel-title,.panel-warning .panel-title,.panel-danger .panel-title,.panel-info .panel-title{color:#fff}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix:after{clear:both}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed} \ No newline at end of file diff --git a/docs/site/css/font-awesome-4.0.3.css b/docs/site/css/font-awesome-4.0.3.css new file mode 100644 index 0000000..048cff9 --- /dev/null +++ b/docs/site/css/font-awesome-4.0.3.css @@ -0,0 +1,1338 @@ +/*! + * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('../fonts/fontawesome-webfont.eot?v=4.0.3'); + src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.0.3') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff?v=4.0.3') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.0.3') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} +.fa { + display: inline-block; + font-family: FontAwesome; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.3333333333333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.fa-2x { + font-size: 2em; +} +.fa-3x { + font-size: 3em; +} +.fa-4x { + font-size: 4em; +} +.fa-5x { + font-size: 5em; +} +.fa-fw { + width: 1.2857142857142858em; + text-align: center; +} +.fa-ul { + padding-left: 0; + margin-left: 2.142857142857143em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} +.fa-li { + position: absolute; + left: -2.142857142857143em; + width: 2.142857142857143em; + top: 0.14285714285714285em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.8571428571428572em; +} +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.fa.pull-left { + margin-right: .3em; +} +.fa.pull-right { + margin-left: .3em; +} +.fa-spin { + -webkit-animation: spin 2s infinite linear; + -moz-animation: spin 2s infinite linear; + -o-animation: spin 2s infinite linear; + animation: spin 2s infinite linear; +} +@-moz-keyframes spin { + 0% { + -moz-transform: rotate(0deg); + } + 100% { + -moz-transform: rotate(359deg); + } +} +@-webkit-keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + } +} +@-o-keyframes spin { + 0% { + -o-transform: rotate(0deg); + } + 100% { + -o-transform: rotate(359deg); + } +} +@-ms-keyframes spin { + 0% { + -ms-transform: rotate(0deg); + } + 100% { + -ms-transform: rotate(359deg); + } +} +@keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(359deg); + } +} +.fa-rotate-90 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -ms-transform: rotate(90deg); + -o-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -ms-transform: rotate(180deg); + -o-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform: rotate(270deg); + -moz-transform: rotate(270deg); + -ms-transform: rotate(270deg); + -o-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); + -webkit-transform: scale(-1, 1); + -moz-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + -o-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fa-flip-vertical { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); + -webkit-transform: scale(1, -1); + -moz-transform: scale(1, -1); + -ms-transform: scale(1, -1); + -o-transform: scale(1, -1); + transform: scale(1, -1); +} +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.fa-stack-1x, +.fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.fa-stack-1x { + line-height: inherit; +} +.fa-stack-2x { + font-size: 2em; +} +.fa-inverse { + color: #ffffff; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: "\f000"; +} +.fa-music:before { + content: "\f001"; +} +.fa-search:before { + content: "\f002"; +} +.fa-envelope-o:before { + content: "\f003"; +} +.fa-heart:before { + content: "\f004"; +} +.fa-star:before { + content: "\f005"; +} +.fa-star-o:before { + content: "\f006"; +} +.fa-user:before { + content: "\f007"; +} +.fa-film:before { + content: "\f008"; +} +.fa-th-large:before { + content: "\f009"; +} +.fa-th:before { + content: "\f00a"; +} +.fa-th-list:before { + content: "\f00b"; +} +.fa-check:before { + content: "\f00c"; +} +.fa-times:before { + content: "\f00d"; +} +.fa-search-plus:before { + content: "\f00e"; +} +.fa-search-minus:before { + content: "\f010"; +} +.fa-power-off:before { + content: "\f011"; +} +.fa-signal:before { + content: "\f012"; +} +.fa-gear:before, +.fa-cog:before { + content: "\f013"; +} +.fa-trash-o:before { + content: "\f014"; +} +.fa-home:before { + content: "\f015"; +} +.fa-file-o:before { + content: "\f016"; +} +.fa-clock-o:before { + content: "\f017"; +} +.fa-road:before { + content: "\f018"; +} +.fa-download:before { + content: "\f019"; +} +.fa-arrow-circle-o-down:before { + content: "\f01a"; +} +.fa-arrow-circle-o-up:before { + content: "\f01b"; +} +.fa-inbox:before { + content: "\f01c"; +} +.fa-play-circle-o:before { + content: "\f01d"; +} +.fa-rotate-right:before, +.fa-repeat:before { + content: "\f01e"; +} +.fa-refresh:before { + content: "\f021"; +} +.fa-list-alt:before { + content: "\f022"; +} +.fa-lock:before { + content: "\f023"; +} +.fa-flag:before { + content: "\f024"; +} +.fa-headphones:before { + content: "\f025"; +} +.fa-volume-off:before { + content: "\f026"; +} +.fa-volume-down:before { + content: "\f027"; +} +.fa-volume-up:before { + content: "\f028"; +} +.fa-qrcode:before { + content: "\f029"; +} +.fa-barcode:before { + content: "\f02a"; +} +.fa-tag:before { + content: "\f02b"; +} +.fa-tags:before { + content: "\f02c"; +} +.fa-book:before { + content: "\f02d"; +} +.fa-bookmark:before { + content: "\f02e"; +} +.fa-print:before { + content: "\f02f"; +} +.fa-camera:before { + content: "\f030"; +} +.fa-font:before { + content: "\f031"; +} +.fa-bold:before { + content: "\f032"; +} +.fa-italic:before { + content: "\f033"; +} +.fa-text-height:before { + content: "\f034"; +} +.fa-text-width:before { + content: "\f035"; +} +.fa-align-left:before { + content: "\f036"; +} +.fa-align-center:before { + content: "\f037"; +} +.fa-align-right:before { + content: "\f038"; +} +.fa-align-justify:before { + content: "\f039"; +} +.fa-list:before { + content: "\f03a"; +} +.fa-dedent:before, +.fa-outdent:before { + content: "\f03b"; +} +.fa-indent:before { + content: "\f03c"; +} +.fa-video-camera:before { + content: "\f03d"; +} +.fa-picture-o:before { + content: "\f03e"; +} +.fa-pencil:before { + content: "\f040"; +} +.fa-map-marker:before { + content: "\f041"; +} +.fa-adjust:before { + content: "\f042"; +} +.fa-tint:before { + content: "\f043"; +} +.fa-edit:before, +.fa-pencil-square-o:before { + content: "\f044"; +} +.fa-share-square-o:before { + content: "\f045"; +} +.fa-check-square-o:before { + content: "\f046"; +} +.fa-arrows:before { + content: "\f047"; +} +.fa-step-backward:before { + content: "\f048"; +} +.fa-fast-backward:before { + content: "\f049"; +} +.fa-backward:before { + content: "\f04a"; +} +.fa-play:before { + content: "\f04b"; +} +.fa-pause:before { + content: "\f04c"; +} +.fa-stop:before { + content: "\f04d"; +} +.fa-forward:before { + content: "\f04e"; +} +.fa-fast-forward:before { + content: "\f050"; +} +.fa-step-forward:before { + content: "\f051"; +} +.fa-eject:before { + content: "\f052"; +} +.fa-chevron-left:before { + content: "\f053"; +} +.fa-chevron-right:before { + content: "\f054"; +} +.fa-plus-circle:before { + content: "\f055"; +} +.fa-minus-circle:before { + content: "\f056"; +} +.fa-times-circle:before { + content: "\f057"; +} +.fa-check-circle:before { + content: "\f058"; +} +.fa-question-circle:before { + content: "\f059"; +} +.fa-info-circle:before { + content: "\f05a"; +} +.fa-crosshairs:before { + content: "\f05b"; +} +.fa-times-circle-o:before { + content: "\f05c"; +} +.fa-check-circle-o:before { + content: "\f05d"; +} +.fa-ban:before { + content: "\f05e"; +} +.fa-arrow-left:before { + content: "\f060"; +} +.fa-arrow-right:before { + content: "\f061"; +} +.fa-arrow-up:before { + content: "\f062"; +} +.fa-arrow-down:before { + content: "\f063"; +} +.fa-mail-forward:before, +.fa-share:before { + content: "\f064"; +} +.fa-expand:before { + content: "\f065"; +} +.fa-compress:before { + content: "\f066"; +} +.fa-plus:before { + content: "\f067"; +} +.fa-minus:before { + content: "\f068"; +} +.fa-asterisk:before { + content: "\f069"; +} +.fa-exclamation-circle:before { + content: "\f06a"; +} +.fa-gift:before { + content: "\f06b"; +} +.fa-leaf:before { + content: "\f06c"; +} +.fa-fire:before { + content: "\f06d"; +} +.fa-eye:before { + content: "\f06e"; +} +.fa-eye-slash:before { + content: "\f070"; +} +.fa-warning:before, +.fa-exclamation-triangle:before { + content: "\f071"; +} +.fa-plane:before { + content: "\f072"; +} +.fa-calendar:before { + content: "\f073"; +} +.fa-random:before { + content: "\f074"; +} +.fa-comment:before { + content: "\f075"; +} +.fa-magnet:before { + content: "\f076"; +} +.fa-chevron-up:before { + content: "\f077"; +} +.fa-chevron-down:before { + content: "\f078"; +} +.fa-retweet:before { + content: "\f079"; +} +.fa-shopping-cart:before { + content: "\f07a"; +} +.fa-folder:before { + content: "\f07b"; +} +.fa-folder-open:before { + content: "\f07c"; +} +.fa-arrows-v:before { + content: "\f07d"; +} +.fa-arrows-h:before { + content: "\f07e"; +} +.fa-bar-chart-o:before { + content: "\f080"; +} +.fa-twitter-square:before { + content: "\f081"; +} +.fa-facebook-square:before { + content: "\f082"; +} +.fa-camera-retro:before { + content: "\f083"; +} +.fa-key:before { + content: "\f084"; +} +.fa-gears:before, +.fa-cogs:before { + content: "\f085"; +} +.fa-comments:before { + content: "\f086"; +} +.fa-thumbs-o-up:before { + content: "\f087"; +} +.fa-thumbs-o-down:before { + content: "\f088"; +} +.fa-star-half:before { + content: "\f089"; +} +.fa-heart-o:before { + content: "\f08a"; +} +.fa-sign-out:before { + content: "\f08b"; +} +.fa-linkedin-square:before { + content: "\f08c"; +} +.fa-thumb-tack:before { + content: "\f08d"; +} +.fa-external-link:before { + content: "\f08e"; +} +.fa-sign-in:before { + content: "\f090"; +} +.fa-trophy:before { + content: "\f091"; +} +.fa-github-square:before { + content: "\f092"; +} +.fa-upload:before { + content: "\f093"; +} +.fa-lemon-o:before { + content: "\f094"; +} +.fa-phone:before { + content: "\f095"; +} +.fa-square-o:before { + content: "\f096"; +} +.fa-bookmark-o:before { + content: "\f097"; +} +.fa-phone-square:before { + content: "\f098"; +} +.fa-twitter:before { + content: "\f099"; +} +.fa-facebook:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.fa-rss:before { + content: "\f09e"; +} +.fa-hdd-o:before { + content: "\f0a0"; +} +.fa-bullhorn:before { + content: "\f0a1"; +} +.fa-bell:before { + content: "\f0f3"; +} +.fa-certificate:before { + content: "\f0a3"; +} +.fa-hand-o-right:before { + content: "\f0a4"; +} +.fa-hand-o-left:before { + content: "\f0a5"; +} +.fa-hand-o-up:before { + content: "\f0a6"; +} +.fa-hand-o-down:before { + content: "\f0a7"; +} +.fa-arrow-circle-left:before { + content: "\f0a8"; +} +.fa-arrow-circle-right:before { + content: "\f0a9"; +} +.fa-arrow-circle-up:before { + content: "\f0aa"; +} +.fa-arrow-circle-down:before { + content: "\f0ab"; +} +.fa-globe:before { + content: "\f0ac"; +} +.fa-wrench:before { + content: "\f0ad"; +} +.fa-tasks:before { + content: "\f0ae"; +} +.fa-filter:before { + content: "\f0b0"; +} +.fa-briefcase:before { + content: "\f0b1"; +} +.fa-arrows-alt:before { + content: "\f0b2"; +} +.fa-group:before, +.fa-users:before { + content: "\f0c0"; +} +.fa-chain:before, +.fa-link:before { + content: "\f0c1"; +} +.fa-cloud:before { + content: "\f0c2"; +} +.fa-flask:before { + content: "\f0c3"; +} +.fa-cut:before, +.fa-scissors:before { + content: "\f0c4"; +} +.fa-copy:before, +.fa-files-o:before { + content: "\f0c5"; +} +.fa-paperclip:before { + content: "\f0c6"; +} +.fa-save:before, +.fa-floppy-o:before { + content: "\f0c7"; +} +.fa-square:before { + content: "\f0c8"; +} +.fa-bars:before { + content: "\f0c9"; +} +.fa-list-ul:before { + content: "\f0ca"; +} +.fa-list-ol:before { + content: "\f0cb"; +} +.fa-strikethrough:before { + content: "\f0cc"; +} +.fa-underline:before { + content: "\f0cd"; +} +.fa-table:before { + content: "\f0ce"; +} +.fa-magic:before { + content: "\f0d0"; +} +.fa-truck:before { + content: "\f0d1"; +} +.fa-pinterest:before { + content: "\f0d2"; +} +.fa-pinterest-square:before { + content: "\f0d3"; +} +.fa-google-plus-square:before { + content: "\f0d4"; +} +.fa-google-plus:before { + content: "\f0d5"; +} +.fa-money:before { + content: "\f0d6"; +} +.fa-caret-down:before { + content: "\f0d7"; +} +.fa-caret-up:before { + content: "\f0d8"; +} +.fa-caret-left:before { + content: "\f0d9"; +} +.fa-caret-right:before { + content: "\f0da"; +} +.fa-columns:before { + content: "\f0db"; +} +.fa-unsorted:before, +.fa-sort:before { + content: "\f0dc"; +} +.fa-sort-down:before, +.fa-sort-asc:before { + content: "\f0dd"; +} +.fa-sort-up:before, +.fa-sort-desc:before { + content: "\f0de"; +} +.fa-envelope:before { + content: "\f0e0"; +} +.fa-linkedin:before { + content: "\f0e1"; +} +.fa-rotate-left:before, +.fa-undo:before { + content: "\f0e2"; +} +.fa-legal:before, +.fa-gavel:before { + content: "\f0e3"; +} +.fa-dashboard:before, +.fa-tachometer:before { + content: "\f0e4"; +} +.fa-comment-o:before { + content: "\f0e5"; +} +.fa-comments-o:before { + content: "\f0e6"; +} +.fa-flash:before, +.fa-bolt:before { + content: "\f0e7"; +} +.fa-sitemap:before { + content: "\f0e8"; +} +.fa-umbrella:before { + content: "\f0e9"; +} +.fa-paste:before, +.fa-clipboard:before { + content: "\f0ea"; +} +.fa-lightbulb-o:before { + content: "\f0eb"; +} +.fa-exchange:before { + content: "\f0ec"; +} +.fa-cloud-download:before { + content: "\f0ed"; +} +.fa-cloud-upload:before { + content: "\f0ee"; +} +.fa-user-md:before { + content: "\f0f0"; +} +.fa-stethoscope:before { + content: "\f0f1"; +} +.fa-suitcase:before { + content: "\f0f2"; +} +.fa-bell-o:before { + content: "\f0a2"; +} +.fa-coffee:before { + content: "\f0f4"; +} +.fa-cutlery:before { + content: "\f0f5"; +} +.fa-file-text-o:before { + content: "\f0f6"; +} +.fa-building-o:before { + content: "\f0f7"; +} +.fa-hospital-o:before { + content: "\f0f8"; +} +.fa-ambulance:before { + content: "\f0f9"; +} +.fa-medkit:before { + content: "\f0fa"; +} +.fa-fighter-jet:before { + content: "\f0fb"; +} +.fa-beer:before { + content: "\f0fc"; +} +.fa-h-square:before { + content: "\f0fd"; +} +.fa-plus-square:before { + content: "\f0fe"; +} +.fa-angle-double-left:before { + content: "\f100"; +} +.fa-angle-double-right:before { + content: "\f101"; +} +.fa-angle-double-up:before { + content: "\f102"; +} +.fa-angle-double-down:before { + content: "\f103"; +} +.fa-angle-left:before { + content: "\f104"; +} +.fa-angle-right:before { + content: "\f105"; +} +.fa-angle-up:before { + content: "\f106"; +} +.fa-angle-down:before { + content: "\f107"; +} +.fa-desktop:before { + content: "\f108"; +} +.fa-laptop:before { + content: "\f109"; +} +.fa-tablet:before { + content: "\f10a"; +} +.fa-mobile-phone:before, +.fa-mobile:before { + content: "\f10b"; +} +.fa-circle-o:before { + content: "\f10c"; +} +.fa-quote-left:before { + content: "\f10d"; +} +.fa-quote-right:before { + content: "\f10e"; +} +.fa-spinner:before { + content: "\f110"; +} +.fa-circle:before { + content: "\f111"; +} +.fa-mail-reply:before, +.fa-reply:before { + content: "\f112"; +} +.fa-github-alt:before { + content: "\f113"; +} +.fa-folder-o:before { + content: "\f114"; +} +.fa-folder-open-o:before { + content: "\f115"; +} +.fa-smile-o:before { + content: "\f118"; +} +.fa-frown-o:before { + content: "\f119"; +} +.fa-meh-o:before { + content: "\f11a"; +} +.fa-gamepad:before { + content: "\f11b"; +} +.fa-keyboard-o:before { + content: "\f11c"; +} +.fa-flag-o:before { + content: "\f11d"; +} +.fa-flag-checkered:before { + content: "\f11e"; +} +.fa-terminal:before { + content: "\f120"; +} +.fa-code:before { + content: "\f121"; +} +.fa-reply-all:before { + content: "\f122"; +} +.fa-mail-reply-all:before { + content: "\f122"; +} +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: "\f123"; +} +.fa-location-arrow:before { + content: "\f124"; +} +.fa-crop:before { + content: "\f125"; +} +.fa-code-fork:before { + content: "\f126"; +} +.fa-unlink:before, +.fa-chain-broken:before { + content: "\f127"; +} +.fa-question:before { + content: "\f128"; +} +.fa-info:before { + content: "\f129"; +} +.fa-exclamation:before { + content: "\f12a"; +} +.fa-superscript:before { + content: "\f12b"; +} +.fa-subscript:before { + content: "\f12c"; +} +.fa-eraser:before { + content: "\f12d"; +} +.fa-puzzle-piece:before { + content: "\f12e"; +} +.fa-microphone:before { + content: "\f130"; +} +.fa-microphone-slash:before { + content: "\f131"; +} +.fa-shield:before { + content: "\f132"; +} +.fa-calendar-o:before { + content: "\f133"; +} +.fa-fire-extinguisher:before { + content: "\f134"; +} +.fa-rocket:before { + content: "\f135"; +} +.fa-maxcdn:before { + content: "\f136"; +} +.fa-chevron-circle-left:before { + content: "\f137"; +} +.fa-chevron-circle-right:before { + content: "\f138"; +} +.fa-chevron-circle-up:before { + content: "\f139"; +} +.fa-chevron-circle-down:before { + content: "\f13a"; +} +.fa-html5:before { + content: "\f13b"; +} +.fa-css3:before { + content: "\f13c"; +} +.fa-anchor:before { + content: "\f13d"; +} +.fa-unlock-alt:before { + content: "\f13e"; +} +.fa-bullseye:before { + content: "\f140"; +} +.fa-ellipsis-h:before { + content: "\f141"; +} +.fa-ellipsis-v:before { + content: "\f142"; +} +.fa-rss-square:before { + content: "\f143"; +} +.fa-play-circle:before { + content: "\f144"; +} +.fa-ticket:before { + content: "\f145"; +} +.fa-minus-square:before { + content: "\f146"; +} +.fa-minus-square-o:before { + content: "\f147"; +} +.fa-level-up:before { + content: "\f148"; +} +.fa-level-down:before { + content: "\f149"; +} +.fa-check-square:before { + content: "\f14a"; +} +.fa-pencil-square:before { + content: "\f14b"; +} +.fa-external-link-square:before { + content: "\f14c"; +} +.fa-share-square:before { + content: "\f14d"; +} +.fa-compass:before { + content: "\f14e"; +} +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: "\f150"; +} +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: "\f151"; +} +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: "\f152"; +} +.fa-euro:before, +.fa-eur:before { + content: "\f153"; +} +.fa-gbp:before { + content: "\f154"; +} +.fa-dollar:before, +.fa-usd:before { + content: "\f155"; +} +.fa-rupee:before, +.fa-inr:before { + content: "\f156"; +} +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: "\f157"; +} +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: "\f158"; +} +.fa-won:before, +.fa-krw:before { + content: "\f159"; +} +.fa-bitcoin:before, +.fa-btc:before { + content: "\f15a"; +} +.fa-file:before { + content: "\f15b"; +} +.fa-file-text:before { + content: "\f15c"; +} +.fa-sort-alpha-asc:before { + content: "\f15d"; +} +.fa-sort-alpha-desc:before { + content: "\f15e"; +} +.fa-sort-amount-asc:before { + content: "\f160"; +} +.fa-sort-amount-desc:before { + content: "\f161"; +} +.fa-sort-numeric-asc:before { + content: "\f162"; +} +.fa-sort-numeric-desc:before { + content: "\f163"; +} +.fa-thumbs-up:before { + content: "\f164"; +} +.fa-thumbs-down:before { + content: "\f165"; +} +.fa-youtube-square:before { + content: "\f166"; +} +.fa-youtube:before { + content: "\f167"; +} +.fa-xing:before { + content: "\f168"; +} +.fa-xing-square:before { + content: "\f169"; +} +.fa-youtube-play:before { + content: "\f16a"; +} +.fa-dropbox:before { + content: "\f16b"; +} +.fa-stack-overflow:before { + content: "\f16c"; +} +.fa-instagram:before { + content: "\f16d"; +} +.fa-flickr:before { + content: "\f16e"; +} +.fa-adn:before { + content: "\f170"; +} +.fa-bitbucket:before { + content: "\f171"; +} +.fa-bitbucket-square:before { + content: "\f172"; +} +.fa-tumblr:before { + content: "\f173"; +} +.fa-tumblr-square:before { + content: "\f174"; +} +.fa-long-arrow-down:before { + content: "\f175"; +} +.fa-long-arrow-up:before { + content: "\f176"; +} +.fa-long-arrow-left:before { + content: "\f177"; +} +.fa-long-arrow-right:before { + content: "\f178"; +} +.fa-apple:before { + content: "\f179"; +} +.fa-windows:before { + content: "\f17a"; +} +.fa-android:before { + content: "\f17b"; +} +.fa-linux:before { + content: "\f17c"; +} +.fa-dribbble:before { + content: "\f17d"; +} +.fa-skype:before { + content: "\f17e"; +} +.fa-foursquare:before { + content: "\f180"; +} +.fa-trello:before { + content: "\f181"; +} +.fa-female:before { + content: "\f182"; +} +.fa-male:before { + content: "\f183"; +} +.fa-gittip:before { + content: "\f184"; +} +.fa-sun-o:before { + content: "\f185"; +} +.fa-moon-o:before { + content: "\f186"; +} +.fa-archive:before { + content: "\f187"; +} +.fa-bug:before { + content: "\f188"; +} +.fa-vk:before { + content: "\f189"; +} +.fa-weibo:before { + content: "\f18a"; +} +.fa-renren:before { + content: "\f18b"; +} +.fa-pagelines:before { + content: "\f18c"; +} +.fa-stack-exchange:before { + content: "\f18d"; +} +.fa-arrow-circle-o-right:before { + content: "\f18e"; +} +.fa-arrow-circle-o-left:before { + content: "\f190"; +} +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: "\f191"; +} +.fa-dot-circle-o:before { + content: "\f192"; +} +.fa-wheelchair:before { + content: "\f193"; +} +.fa-vimeo-square:before { + content: "\f194"; +} +.fa-turkish-lira:before, +.fa-try:before { + content: "\f195"; +} +.fa-plus-square-o:before { + content: "\f196"; +} diff --git a/docs/site/css/highlight.css b/docs/site/css/highlight.css new file mode 100644 index 0000000..da7fdb9 --- /dev/null +++ b/docs/site/css/highlight.css @@ -0,0 +1,125 @@ +/* +This is the GitHub theme for highlight.js + +github.com style (c) Vasily Polovnyov + +*/ + +.hljs { + display: block; padding: 0.5em; + color: #333; +} + +.hljs-comment, +.hljs-template_comment, +.diff .hljs-header, +.hljs-javadoc { + color: #998; + font-style: italic +} + +.hljs-keyword, +.css .rule .hljs-keyword, +.hljs-winutils, +.javascript .hljs-title, +.nginx .hljs-title, +.hljs-subst, +.hljs-request, +.hljs-status { + color: #333; + font-weight: bold +} + +.hljs-number, +.hljs-hexcolor, +.ruby .hljs-constant { + color: #099; +} + +.hljs-string, +.hljs-tag .hljs-value, +.hljs-phpdoc, +.tex .hljs-formula { + color: #d14 +} + +.hljs-title, +.hljs-id, +.coffeescript .hljs-params, +.scss .hljs-preprocessor { + color: #900; + font-weight: bold +} + +.javascript .hljs-title, +.lisp .hljs-title, +.clojure .hljs-title, +.hljs-subst { + font-weight: normal +} + +.hljs-class .hljs-title, +.haskell .hljs-type, +.vhdl .hljs-literal, +.tex .hljs-command { + color: #458; + font-weight: bold +} + +.hljs-tag, +.hljs-tag .hljs-title, +.hljs-rules .hljs-property, +.django .hljs-tag .hljs-keyword { + color: #000080; + font-weight: normal +} + +.hljs-attribute, +.hljs-variable, +.lisp .hljs-body { + color: #008080 +} + +.hljs-regexp { + color: #009926 +} + +.hljs-symbol, +.ruby .hljs-symbol .hljs-string, +.lisp .hljs-keyword, +.tex .hljs-special, +.hljs-prompt { + color: #990073 +} + +.hljs-built_in, +.lisp .hljs-title, +.clojure .hljs-built_in { + color: #0086b3 +} + +.hljs-preprocessor, +.hljs-pragma, +.hljs-pi, +.hljs-doctype, +.hljs-shebang, +.hljs-cdata { + color: #999; + font-weight: bold +} + +.hljs-deletion { + background: #fdd +} + +.hljs-addition { + background: #dfd +} + +.diff .hljs-change { + background: #0086b3 +} + +.hljs-chunk { + color: #aaa +} diff --git a/docs/site/css/prettify-1.0.css b/docs/site/css/prettify-1.0.css new file mode 100644 index 0000000..e0df245 --- /dev/null +++ b/docs/site/css/prettify-1.0.css @@ -0,0 +1,28 @@ +.com { color: #93a1a1; } +.lit { color: #195f91; } +.pun, .opn, .clo { color: #93a1a1; } +.fun { color: #dc322f; } +.str, .atv { color: #D14; } +.kwd, .prettyprint .tag { color: #1e347b; } +.typ, .atn, .dec, .var { color: teal; } +.pln { color: #48484c; } + +.prettyprint { + padding: 8px; +} +.prettyprint.linenums { + -webkit-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; + -moz-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; + box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; +} + +/* Specify class=linenums on a pre to get line numbering */ +ol.linenums { + margin: 0 0 0 33px; /* IE indents via margin-left */ +} +ol.linenums li { + padding-left: 12px; + color: #bebec5; + line-height: 20px; + text-shadow: 0 1px 0 #fff; +} diff --git a/docs/site/fonts/fontawesome-webfont.eot b/docs/site/fonts/fontawesome-webfont.eot new file mode 100755 index 0000000..7c79c6a --- /dev/null +++ b/docs/site/fonts/fontawesome-webfont.eot diff --git a/docs/site/fonts/fontawesome-webfont.svg b/docs/site/fonts/fontawesome-webfont.svg new file mode 100755 index 0000000..45fdf33 --- /dev/null +++ b/docs/site/fonts/fontawesome-webfont.svg @@ -0,0 +1,414 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/site/fonts/fontawesome-webfont.ttf b/docs/site/fonts/fontawesome-webfont.ttf new file mode 100755 index 0000000..e89738d --- /dev/null +++ b/docs/site/fonts/fontawesome-webfont.ttf diff --git a/docs/site/fonts/fontawesome-webfont.woff b/docs/site/fonts/fontawesome-webfont.woff new file mode 100755 index 0000000..8c1748a --- /dev/null +++ b/docs/site/fonts/fontawesome-webfont.woff diff --git a/docs/site/img/favicon.ico b/docs/site/img/favicon.ico new file mode 100644 index 0000000..e85006a --- /dev/null +++ b/docs/site/img/favicon.ico diff --git a/docs/site/img/grid.png b/docs/site/img/grid.png new file mode 100644 index 0000000..878c3ed --- /dev/null +++ b/docs/site/img/grid.png diff --git a/docs/site/index.html b/docs/site/index.html new file mode 100644 index 0000000..af1b197 --- /dev/null +++ b/docs/site/index.html @@ -0,0 +1,86 @@ + + + + + + + + + + + + My Docs + + + + + + + + + + + + + + + + + + + + + + + My Docs + + + + + + + + + + + + + + + + + + + + +www.openbiometrics.org +Identify the latest tagged release. +$ git clone https://github.com/biometrics/openbr.git +$ cd openbr +$ git checkout <tag> +$ git submodule init +$ git submodule update + +Build Instructions + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/site/js/base.js b/docs/site/js/base.js new file mode 100644 index 0000000..7f18720 --- /dev/null +++ b/docs/site/js/base.js @@ -0,0 +1,53 @@ + +/* Highlight */ +$( document ).ready(function() { + hljs.initHighlightingOnLoad(); + $('table').addClass('table'); +}); + + +/* Scrollspy */ +var navHeight = $('.navbar').outerHeight(true) + 10 + +$('body').scrollspy({ + target: '.bs-sidebar', + offset: navHeight +}) + + +/* Prevent disabled links from causing a page reload */ +$("li.disabled a").click(function() { + event.preventDefault(); +}); + + +/* Adjust the scroll height of anchors to compensate for the fixed navbar */ +window.disableShift = false; +var shiftWindow = function() { + if (window.disableShift) { + window.disableShift = false; + } else { + /* If we're at the bottom of the page, don't erronously scroll up */ + var scrolledToBottomOfPage = ( + (window.innerHeight + window.scrollY) >= document.body.offsetHeight + ); + if (!scrolledToBottomOfPage) { + scrollBy(0, -60); + }; + }; +}; +if (location.hash) {shiftWindow();} +window.addEventListener("hashchange", shiftWindow); + + +/* Deal with clicks on nav links that do not change the current anchor link. */ +$("ul.nav a" ).click(function() { + var href = this.href; + var suffix = location.hash; + var matchesCurrentHash = (href.indexOf(suffix, href.length - suffix.length) !== -1); + if (location.hash && matchesCurrentHash) { + /* Force a single 'hashchange' event to occur after the click event */ + window.disableShift = true; + location.hash=''; + }; +}); diff --git a/docs/site/js/bootstrap-3.0.3.min.js b/docs/site/js/bootstrap-3.0.3.min.js new file mode 100644 index 0000000..1a6258e --- /dev/null +++ b/docs/site/js/bootstrap-3.0.3.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.0.3 (http://getbootstrap.com) + * Copyright 2013 Twitter, Inc. + * Licensed under http://www.apache.org/licenses/LICENSE-2.0 + */ + +if("undefined"==typeof jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]'),b=!0;if(a.length){var c=this.$element.find("input");"radio"===c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?b=!1:a.find(".active").removeClass("active")),b&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}b&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('').insertAfter(a(this)).on("click",b),f.trigger(d=a.Event("show.bs.dropdown")),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown"),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=a("[role=menu] li:not(.divider):visible a",f);if(h.length){var i=h.index(h.filter(":focus"));38==b.keyCode&&i>0&&i--,40==b.keyCode&&i').appendTo(document.body),this.$element.on("click.dismiss.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),d&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;d?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()):b&&b()};var c=a.fn.modal;a.fn.modal=function(c,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},b.DEFAULTS,e.data(),"object"==typeof c&&c);f||e.data("bs.modal",f=new b(this,g)),"string"==typeof c?f[c](d):g.show&&f.show(d)})},a.fn.modal.Constructor=b,a.fn.modal.noConflict=function(){return a.fn.modal=c,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d=c.attr("href"),e=a(c.attr("data-target")||d&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("modal")?"toggle":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());b.preventDefault(),e.modal(f,this).one("hide",function(){c.is(":visible")&&c.focus()})}),a(document).on("show.bs.modal",".modal",function(){a(document.body).addClass("modal-open")}).on("hidden.bs.modal",".modal",function(){a(document.body).removeClass("modal-open")})}(jQuery),+function(a){"use strict";var b=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};b.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},b.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focus",i="hover"==g?"mouseleave":"blur";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},b.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},b.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show),void 0):c.show()},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide),void 0):c.hide()},b.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(b),b.isDefaultPrevented())return;var c=this.tip();this.setContent(),this.options.animation&&c.addClass("fade");var d="function"==typeof this.options.placement?this.options.placement.call(this,c[0],this.$element[0]):this.options.placement,e=/\s?auto?\s?/i,f=e.test(d);f&&(d=d.replace(e,"")||"top"),c.detach().css({top:0,left:0,display:"block"}).addClass(d),this.options.container?c.appendTo(this.options.container):c.insertAfter(this.$element);var g=this.getPosition(),h=c[0].offsetWidth,i=c[0].offsetHeight;if(f){var j=this.$element.parent(),k=d,l=document.documentElement.scrollTop||document.body.scrollTop,m="body"==this.options.container?window.innerWidth:j.outerWidth(),n="body"==this.options.container?window.innerHeight:j.outerHeight(),o="body"==this.options.container?0:j.offset().left;d="bottom"==d&&g.top+g.height+i-l>n?"top":"top"==d&&g.top-l-i<0?"bottom":"right"==d&&g.right+h>m?"left":"left"==d&&g.left-h'}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unpin&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery); \ No newline at end of file diff --git a/docs/site/js/highlight.pack.js b/docs/site/js/highlight.pack.js new file mode 100644 index 0000000..75d830c --- /dev/null +++ b/docs/site/js/highlight.pack.js @@ -0,0 +1 @@ +var hljs=new function(){function k(v){return v.replace(/&/gm,"&").replace(//gm,">")}function t(v){return v.nodeName.toLowerCase()}function i(w,x){var v=w&&w.exec(x);return v&&v.index==0}function d(v){return Array.prototype.map.call(v.childNodes,function(w){if(w.nodeType==3){return b.useBR?w.nodeValue.replace(/\n/g,""):w.nodeValue}if(t(w)=="br"){return"\n"}return d(w)}).join("")}function r(w){var v=(w.className+" "+(w.parentNode?w.parentNode.className:"")).split(/\s+/);v=v.map(function(x){return x.replace(/^language-/,"")});return v.filter(function(x){return j(x)||x=="no-highlight"})[0]}function o(x,y){var v={};for(var w in x){v[w]=x[w]}if(y){for(var w in y){v[w]=y[w]}}return v}function u(x){var v=[];(function w(y,z){for(var A=y.firstChild;A;A=A.nextSibling){if(A.nodeType==3){z+=A.nodeValue.length}else{if(t(A)=="br"){z+=1}else{if(A.nodeType==1){v.push({event:"start",offset:z,node:A});z=w(A,z);v.push({event:"stop",offset:z,node:A})}}}}return z})(x,0);return v}function q(w,y,C){var x=0;var F="";var z=[];function B(){if(!w.length||!y.length){return w.length?w:y}if(w[0].offset!=y[0].offset){return(w[0].offset"}function E(G){F+=""+t(G)+">"}function v(G){(G.event=="start"?A:E)(G.node)}while(w.length||y.length){var D=B();F+=k(C.substr(x,D[0].offset-x));x=D[0].offset;if(D==w){z.reverse().forEach(E);do{v(D.splice(0,1)[0]);D=B()}while(D==w&&D.length&&D[0].offset==x);z.reverse().forEach(A)}else{if(D[0].event=="start"){z.push(D[0].node)}else{z.pop()}v(D.splice(0,1)[0])}}return F+k(C.substr(x))}function m(y){function v(z){return(z&&z.source)||z}function w(A,z){return RegExp(v(A),"m"+(y.cI?"i":"")+(z?"g":""))}function x(D,C){if(D.compiled){return}D.compiled=true;D.k=D.k||D.bK;if(D.k){var z={};function E(G,F){if(y.cI){F=F.toLowerCase()}F.split(" ").forEach(function(H){var I=H.split("|");z[I[0]]=[G,I[1]?Number(I[1]):1]})}if(typeof D.k=="string"){E("keyword",D.k)}else{Object.keys(D.k).forEach(function(F){E(F,D.k[F])})}D.k=z}D.lR=w(D.l||/\b[A-Za-z0-9_]+\b/,true);if(C){if(D.bK){D.b=D.bK.split(" ").join("|")}if(!D.b){D.b=/\B|\b/}D.bR=w(D.b);if(!D.e&&!D.eW){D.e=/\B|\b/}if(D.e){D.eR=w(D.e)}D.tE=v(D.e)||"";if(D.eW&&C.tE){D.tE+=(D.e?"|":"")+C.tE}}if(D.i){D.iR=w(D.i)}if(D.r===undefined){D.r=1}if(!D.c){D.c=[]}var B=[];D.c.forEach(function(F){if(F.v){F.v.forEach(function(G){B.push(o(F,G))})}else{B.push(F=="self"?D:F)}});D.c=B;D.c.forEach(function(F){x(F,D)});if(D.starts){x(D.starts,C)}var A=D.c.map(function(F){return F.bK?"\\.?\\b("+F.b+")\\b\\.?":F.b}).concat([D.tE]).concat([D.i]).map(v).filter(Boolean);D.t=A.length?w(A.join("|"),true):{exec:function(F){return null}};D.continuation={}}x(y)}function c(S,L,J,R){function v(U,V){for(var T=0;T";U+=Z+'">';return U+X+Y}function N(){var U=k(C);if(!I.k){return U}var T="";var X=0;I.lR.lastIndex=0;var V=I.lR.exec(U);while(V){T+=U.substr(X,V.index-X);var W=E(I,V);if(W){H+=W[1];T+=w(W[0],V[0])}else{T+=V[0]}X=I.lR.lastIndex;V=I.lR.exec(U)}return T+U.substr(X)}function F(){if(I.sL&&!f[I.sL]){return k(C)}var T=I.sL?c(I.sL,C,true,I.continuation.top):g(C);if(I.r>0){H+=T.r}if(I.subLanguageMode=="continuous"){I.continuation.top=T.top}return w(T.language,T.value,false,true)}function Q(){return I.sL!==undefined?F():N()}function P(V,U){var T=V.cN?w(V.cN,"",true):"";if(V.rB){D+=T;C=""}else{if(V.eB){D+=k(U)+T;C=""}else{D+=T;C=U}}I=Object.create(V,{parent:{value:I}})}function G(T,X){C+=T;if(X===undefined){D+=Q();return 0}var V=v(X,I);if(V){D+=Q();P(V,X);return V.rB?0:X.length}var W=z(I,X);if(W){var U=I;if(!(U.rE||U.eE)){C+=X}D+=Q();do{if(I.cN){D+=""}H+=I.r;I=I.parent}while(I!=W.parent);if(U.eE){D+=k(X)}C="";if(W.starts){P(W.starts,"")}return U.rE?0:X.length}if(A(X,I)){throw new Error('Illegal lexeme "'+X+'" for mode "'+(I.cN||"")+'"')}C+=X;return X.length||1}var M=j(S);if(!M){throw new Error('Unknown language: "'+S+'"')}m(M);var I=R||M;var D="";for(var K=I;K!=M;K=K.parent){if(K.cN){D=w(K.cN,D,true)}}var C="";var H=0;try{var B,y,x=0;while(true){I.t.lastIndex=x;B=I.t.exec(L);if(!B){break}y=G(L.substr(x,B.index-x),B[0]);x=B.index+y}G(L.substr(x));for(var K=I;K.parent;K=K.parent){if(K.cN){D+=""}}return{r:H,value:D,language:S,top:I}}catch(O){if(O.message.indexOf("Illegal")!=-1){return{r:0,value:k(L)}}else{throw O}}}function g(y,x){x=x||b.languages||Object.keys(f);var v={r:0,value:k(y)};var w=v;x.forEach(function(z){if(!j(z)){return}var A=c(z,y,false);A.language=z;if(A.r>w.r){w=A}if(A.r>v.r){w=v;v=A}});if(w.language){v.second_best=w}return v}function h(v){if(b.tabReplace){v=v.replace(/^((<[^>]+>|\t)+)/gm,function(w,z,y,x){return z.replace(/\t/g,b.tabReplace)})}if(b.useBR){v=v.replace(/\n/g,"")}return v}function p(z){var y=d(z);var A=r(z);if(A=="no-highlight"){return}var v=A?c(A,y,true):g(y);var w=u(z);if(w.length){var x=document.createElementNS("http://www.w3.org/1999/xhtml","pre");x.innerHTML=v.value;v.value=q(w,u(x),y)}v.value=h(v.value);z.innerHTML=v.value;z.className+=" hljs "+(!A&&v.language||"");z.result={language:v.language,re:v.r};if(v.second_best){z.second_best={language:v.second_best.language,re:v.second_best.r}}}var b={classPrefix:"hljs-",tabReplace:null,useBR:false,languages:undefined};function s(v){b=o(b,v)}function l(){if(l.called){return}l.called=true;var v=document.querySelectorAll("pre code");Array.prototype.forEach.call(v,p)}function a(){addEventListener("DOMContentLoaded",l,false);addEventListener("load",l,false)}var f={};var n={};function e(v,x){var w=f[v]=x(this);if(w.aliases){w.aliases.forEach(function(y){n[y]=v})}}function j(v){return f[v]||f[n[v]]}this.highlight=c;this.highlightAuto=g;this.fixMarkup=h;this.highlightBlock=p;this.configure=s;this.initHighlighting=l;this.initHighlightingOnLoad=a;this.registerLanguage=e;this.getLanguage=j;this.inherit=o;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE]};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE]};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gim]*/,i:/\n/,c:[this.BE,{b:/\[/,e:/\]/,r:0,c:[this.BE]}]};this.TM={cN:"title",b:this.IR,r:0};this.UTM={cN:"title",b:this.UIR,r:0}}();hljs.registerLanguage("bash",function(b){var a={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)\}/}]};var d={cN:"string",b:/"/,e:/"/,c:[b.BE,a,{cN:"variable",b:/\$\(/,e:/\)/,c:[b.BE]}]};var c={cN:"string",b:/'/,e:/'/};return{l:/-?[a-z\.]+/,k:{keyword:"if then else elif fi for break continue while in do done exit return set declare case esac export exec",literal:"true false",built_in:"printf echo read cd pwd pushd popd dirs let eval unset typeset readonly getopts source shopt caller type hash bind help sudo",operator:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"shebang",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:true,c:[b.inherit(b.TM,{b:/\w[\w\d_]*/})],r:0},b.HCM,b.NM,d,c,a]}});hljs.registerLanguage("cs",function(b){var a="abstract as base bool break byte case catch char checked const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async await ascending descending from get group into join let orderby partial select set value var where yield";return{k:a,c:[{cN:"comment",b:"///",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"///|"},{cN:"xmlDocTag",b:"?",e:">"}]},b.CLCM,b.CBLCLM,{cN:"preprocessor",b:"#",e:"$",k:"if else elif endif define undef warning error line region endregion pragma checksum"},{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},b.ASM,b.QSM,b.CNM,{bK:"protected public private internal",e:/[{;=]/,k:a,c:[{bK:"class namespace interface",starts:{c:[b.TM]}},{b:b.IR+"\\s*\\(",rB:true,c:[b.TM]}]}]}});hljs.registerLanguage("ruby",function(e){var h="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var g="and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor";var a={cN:"yardoctag",b:"@[A-Za-z]+"};var i={cN:"comment",v:[{b:"#",e:"$",c:[a]},{b:"^\\=begin",e:"^\\=end",c:[a],r:10},{b:"^__END__",e:"\\n$"}]};var c={cN:"subst",b:"#\\{",e:"}",k:g};var d={cN:"string",c:[e.BE,c],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:"%[qw]?\\(",e:"\\)"},{b:"%[qw]?\\[",e:"\\]"},{b:"%[qw]?{",e:"}"},{b:"%[qw]?<",e:">",r:10},{b:"%[qw]?/",e:"/",r:10},{b:"%[qw]?%",e:"%",r:10},{b:"%[qw]?-",e:"-",r:10},{b:"%[qw]?\\|",e:"\\|",r:10},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/}]};var b={cN:"params",b:"\\(",e:"\\)",k:g};var f=[d,i,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+e.IR+"::)?"+e.IR}]},i]},{cN:"function",bK:"def",e:" |$|;",r:0,c:[e.inherit(e.TM,{b:h}),b,i]},{cN:"constant",b:"(::)?(\\b[A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:[d,{b:h}],r:0},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"("+e.RSR+")\\s*",c:[i,{cN:"regexp",c:[e.BE,c],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}],r:0}];c.c=f;b.c=f;return{k:g,c:f}});hljs.registerLanguage("diff",function(a){return{c:[{cN:"chunk",r:10,v:[{b:/^\@\@ +\-\d+,\d+ +\+\d+,\d+ +\@\@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"header",v:[{b:/Index: /,e:/$/},{b:/=====/,e:/=====$/},{b:/^\-\-\-/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+\+\+/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"change",b:"^\\!",e:"$"}]}});hljs.registerLanguage("javascript",function(a){return{aliases:["js"],k:{keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require"},c:[{cN:"pi",b:/^\s*('|")use strict('|")/,r:10},a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{b:"("+a.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[a.CLCM,a.CBLCLM,a.REGEXP_MODE,{b:/,e:/>;/,r:0,sL:"xml"}],r:0},{cN:"function",bK:"function",e:/\{/,c:[a.inherit(a.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:"params",b:/\(/,e:/\)/,c:[a.CLCM,a.CBLCLM],i:/["'\(]/}],i:/\[|%/},{b:/\$[(.]/},{b:"\\."+a.IR,r:0}]}});hljs.registerLanguage("xml",function(a){var c="[A-Za-z0-9\\._:-]+";var d={b:/<\?(php)?(?!\w)/,e:/\?>/,sL:"php",subLanguageMode:"continuous"};var b={eW:true,i:/,r:0,c:[d,{cN:"attribute",b:c,r:0},{b:"=",r:0,c:[{cN:"value",v:[{b:/"/,e:/"/},{b:/'/,e:/'/},{b:/[^\s\/>]+/}]}]}]};return{aliases:["html"],cI:true,c:[{cN:"doctype",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"",rE:true,sL:"css"}},{cN:"tag",b:"
Page not found
www.openbiometrics.org
Identify the latest tagged release.
$ git clone https://github.com/biometrics/openbr.git +$ cd openbr +$ git checkout <tag> +$ git submodule init +$ git submodule update +
Build Instructions